上一天我們學習了通過FileOutputStream類和FileInputStream類實作檔案的讀寫。FileOutputStream類與PrintStream類結合使用,實作寫入檔案的功能;FileInputStream類與StringBuilder類結合使用,實作讀取檔案的功能。
1 概述
今天我們繼續學習檔案讀寫,主要實作對SD卡中檔案讀寫的實作。通過InputStreamReader類和OutputStreamWriter類實作檔案的讀取和寫入。在寫入的EditText控件中輸入要寫入的内容,之後點選“寫入”按鍵,如圖1所示。
圖1 向SD卡中寫入指定内容
然後可以在安卓系統中檢視SD卡上指定檔案的内容,已經變為寫入的内容,如圖2所示。
圖2 指定檔案的内容已更改
最後,點選“讀出”按鍵,在讀出的EditText控件中顯示讀出指定檔案的内容,如圖3所示。
圖3 從SD卡的指定檔案中讀取
在“基于Java語言的安卓程式設計學習之檔案讀寫(上)”的代碼基礎上進行修改。主要更改write()方法和read()方法,即讀取資料和寫入資料的方法。
2 檔案寫入
通過OutputStreamWriter類實作檔案的寫入。需要使用FileOutputStream類來定義OutputStreamWriter類。在“基于Java語言的安卓程式設計學習之檔案讀寫(上)”中提到,可以使用openFileOutput()方法擷取FileOutputStream類。本文将介紹另外一種擷取FileOutputStream類的方法,即通過該類的構造函數來建立類的對象。
2.1 建立FileOutputStream類的對象
該類的構造函數有多種格式,其中一種格式為
publicFileOutputStream(File file)
throws FileNotFoundException
該函數的參數為File類的對象,并且抛出異常。是以,使用該構造函數需要使用異常處理,即try-catch語句。并且,在調用構造函數之前,需要定義File類的對象。
在write()方法中,首先寫入try-catch語句,語句的格式與“基于Java語言的安卓程式設計學習之檔案讀寫(上)”中介紹的代碼相同。在try執行塊中,首先定義File類的對象,如下所示:
1 File targetFile = new File(FILE_NAME);
2 targetFile.createNewFile();
在第1行中,通過new關鍵字定義了File類的對象targetFile,其中FILE_NAME為指定檔案的路徑,其定義為
private String FILE_NAME = "/storage/sd_external/text.txt";
第2行中,通過targetFile調用File類的方法createNewFile()來建立新空檔案。
接下來通過FileOutputStream類的構造函數來建立該類的對象。
FileOutputStream fOut = newFileOutputStream(targetFile);
其中,targetFile是之前建立的File類的對象。
2.2 建立OutputStreamWriter類的對象
OutputStreamWriter類的全稱是java.io.OutputStreamWriter,該類派生自java.io.Writer。該類可以将字元串流轉換為比特流,即如果要寫入流的資料是字元串,可以通過該類将其轉換為位元組,并寫入到流中。OutputStreamWriter類的構造函數有多個格式,其中一個格式為
publicOutputStreamWriter(OutputStream out)
使用該格式建立OutputStreamWriter類的對象。
OutputStreamWriter myOutWriter =
new OutputStreamWriter(fOut);
其中,fOut是之前建立的FileOutputStream類的對象。
2.3 寫入資料
可以通過OutputStreamWriter類的write()方法實作資料的寫入。
myOutWriter.write(content);
其中,myOutWriter是之前建立的OutputStreamWriter類的對象,content是write()方法格式為String的參數,表示要寫入到檔案中的資料。
2.4 關閉Writer及stream
OutputStreamWriter以及FileOutputStream在使用完之後,需要調用類的close()方法進行關閉。
myOutWriter.close();
fOut.close();
其中,myOutWriter是OutputStreamWriter類的對象,fOut是FileOutputStream類的對象。
3 檔案讀取
通過InputStreamReader類實作檔案的讀取。需要使用FileInputStream類來定義InputStreamReader類。
3.1 建立InputStreamReader類的對象
通過InputStreamReader類的構造函數來建立該類的對象。該類的構造函數格式為
publicFileInputStream(File file)
throws FileNotFoundException
是以,在read()方法中,有如下代碼
1 FileInputStream fis = new FileInputStream(FILE_NAME);
2 InputStreamReaderreader = new InputStreamReader(fis);
其中,第1行通過FileInputStream類的構造函數定義了該類的對象;第2行通過InputStreamReader類的構造函數定義了該類的對象。
3.2 讀取檔案
通過BufferedReader類讀取指定檔案。BufferedReader類将Reader與bufferer關聯起來,即從Reader中讀取資料儲存在buffer中。該類的構造函數格式為
publicBufferedReader(Reader in)
可以通過InputStreamReader類的對象實作BufferedReader類。在read()方法中有如下代碼:
BufferedReader br = newBufferedReader(reader);
其中,reader是之前建立的InputStreamReader類的對象,br即為BufferedReader類的對象。
定義了BufferedReader類的對象之後,通過該對象調用BufferedReader類的readLine()方法從檔案中讀取一整行的内容,該方法的傳回值即為讀取到的内容。
1 StringBuilderstrBuilder = newStringBuilder("");
2 Stringline = null;
3 while((line=br.readLine()) !=null )
4 {
5 strBuilder.append(line);
6 }
第1行定義了StringBuilder類的對象strBuilder,用來儲存從檔案中讀取到的資料;第2行中定義了String類的對象line,用來儲存檔案中一整行的資料;第3-6行使用while語句對指定的檔案進行按行讀取,讀到的每一行的内容都儲存在strBuilder中,直到檔案中所有的資料都被讀出。
3.3 傳回資料
read()方法的傳回值即為從指定檔案中讀取到的資料。因為read()方法傳回值的類型是String,是以,需要将StringBuilder類型轉換為String類型。
1 br.close();
2 return strBuilder.toString();
其中,第1行中的br是之前定義的BufferedReader類的對象,在使用完該對象後,調用close()方法關閉;第2行中的strBuilder是之前定義的StringBuilder類的對象,通過該對象調用toString()方法,将從檔案中讀取到的資料轉換為String類型,并且作為方法的傳回值。
4 小結
今天我們學習了使用OutputStreamWriter類和InputStreamReader類實作檔案讀寫的方法。在對檔案進行寫操作時,可以通過OutputStreamWriter類的write()方法實作;在對檔案進行讀操作時,可以通過InputStreamReader類來建立BufferedReader類的對象,通過BufferedReader類的對象調用readLine()方法實作。