天天看點

基于Java語言的安卓程式設計之二十三檔案讀寫(下)

上一天我們學習了通過FileOutputStream類和FileInputStream類實作檔案的讀寫。FileOutputStream類與PrintStream類結合使用,實作寫入檔案的功能;FileInputStream類與StringBuilder類結合使用,實作讀取檔案的功能。

1 概述

今天我們繼續學習檔案讀寫,主要實作對SD卡中檔案讀寫的實作。通過InputStreamReader類和OutputStreamWriter類實作檔案的讀取和寫入。在寫入的EditText控件中輸入要寫入的内容,之後點選“寫入”按鍵,如圖1所示。

基于Java語言的安卓程式設計之二十三檔案讀寫(下)

圖1 向SD卡中寫入指定内容

然後可以在安卓系統中檢視SD卡上指定檔案的内容,已經變為寫入的内容,如圖2所示。

基于Java語言的安卓程式設計之二十三檔案讀寫(下)

圖2 指定檔案的内容已更改

最後,點選“讀出”按鍵,在讀出的EditText控件中顯示讀出指定檔案的内容,如圖3所示。

基于Java語言的安卓程式設計之二十三檔案讀寫(下)

圖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()方法實作。

繼續閱讀