1. 程式人生 > >通過流實現檔案讀寫的方法(上)

通過流實現檔案讀寫的方法(上)

1 流的概念及分類

1.1 流的概念

把不同的輸入/輸出源(鍵盤、硬碟、網路連線等)抽象描述為“流”(stream)。通過流的方式允許程式使用相同的方法來訪問不同的輸入/輸入源。IO流即為輸入輸出流,它可以方便的實現資料的輸入輸出操作。

1.2 流的分類

1.2.1 輸入流和輸出流

按照流的流向來分,可以分為輸入流和輸出流。輸入流指的是隻能從中讀取資料,而不能向其中寫入輸入;輸出流只能向其中寫入資料,而不能從中讀取資料。

比如從記憶體與硬碟之間的資料交換,輸入和輸出都是從記憶體的角度出發的,如圖1所示。


 1 輸入流與輸出流示意圖

1.2.2 位元組流和字元流

按照流中處理的資料單元大小,可以分為位元組流和字元流。位元組流和字元流的用法基本相同,區別在於位元組流和字元流所操作的資料單元不同,位元組流操作的資料單元是

8位的位元組,而字元流操作的資料單元是16位的字元。

位元組流主要由InputStreamOutputStream作為基類,而字元流則主要由ReaderWriter作為基類。

2 寫入資料的三種形式

可以通過如下三種方式對檔案中的資料進行讀取和寫入:位元組流方式、字元流方式以及緩衝區方式。

2.1 位元組流方式讀取寫入資料

1.2.2”中提到,位元組流主要由InputStreamOutputStream作為基類。我們將使用這兩個類的派生類FileInputStreamFileOutputStream實現檔案資料的讀寫。

2.1.1 檔案資料的寫入

使用FileOutputStream類實現檔案資料的寫入,該類的基類是

OutputStreamFileOutputStream類叫做檔案輸入流類,該類主要用於檔案資料的寫入。

2.1.1.1 建立檔案流

首先定義要寫入檔案的絕對路徑:

private String filePath = "/storage/sd_external/1.txt";

其中,/storage/sd_external/”表示安卓系統的外部儲存裝置,即SD卡。

接下來通過FileOutputStream類的建構函式實現該類物件的建立。可以使用兩種方式來建立FileOutputStream類的物件,一種是直接通過檔案的絕對路徑實現,另外一種是通過File類實現。

FileOutputStream fos = new FileOutputStream(filePath);

或者

File file = new File(filePath);

FileOutputStream fos = new FileOutputStream(file);

2.1.1.2 寫入檔案流

通過FileOutputStream類的write()方法將資料寫入到檔案流中。

fos.write(content.getBytes());

其中,content是要寫入檔案的資料,該變數的型別時String型別。在“1.2.2”中提到,FileOutputStream類是位元組類,即write()方法引數的型別應該是byte[],因此需要通過getBytes()方法將String轉換為byte[]

2.1.1.3 關閉檔案流

在程式中如果不再使用檔案流,需要呼叫FileOutputStream類的close()方法來關閉檔案流,並釋放與此流有關的所有系統資源。

fos.close()

需要注意的是,由於位元組流和字元流類的方法都會丟擲異常,因此需要在try-catch語句中使用這些類。

2.1.2 檔案資料的讀取

使用FileInputStream類實現檔案資料的讀取,該類的基類是InputStreamFileInputStream類叫做檔案輸入流類,該類主要用於檔案資料的讀取。

2.1.2.1 建立檔案流

建立檔案輸入流的方法與在2.1.1.1”中介紹的建立檔案輸出流的方法類似。可以使用檔案的絕對路徑進行直接建立

FileInputStream fis = new FileInputStream(filePath);

也可以通過File類建立

File file = new File(filePath);

FileInputStream fis = new FileInputStream(file);

2.1.2.2 讀取檔案流

通過FileInputStream類的read()方法讀取檔案流。

fis.read(content);

其中,content的型別是byte[],讀取到的資料都儲存在該變數中。

2.1.2.3 關閉檔案流

通過FileInputStream類的close()方法關閉檔案資料流。

fis.close();