Java IO5:字元流

五月的倉頡發表於2015-10-18

字元流

位元組流提供了處理任何型別輸入/輸出操作的功能(因為對於計算機而言,一切都是0和1,只需把資料以位元組形式表示就夠了),但它們不可以直接操作Unicode字元,因為上一篇文章寫了,一個Unicode字元佔用2個位元組,而位元組流一次只能操作一個位元組。既然Java的口號就是"一次編寫、處處執行",那麼包含直接的字元輸入/輸出的支援是必要的。因此就有一些字元輸入/輸出流,之前已經說明過了,字元流頂層是Reader和Writer這兩個抽象類,因此就從這裡開始本文。

 

Reader

Reader是定義Java的字元輸入流的抽象類,該類的所有方法在出錯的情況下都將引發IOException。Reader類中有這些方法:

方    法 作    用
abstract void close() 關閉該流並釋放與之關聯的所有資源
void mark(int readAheadLimit) 標記流中的當前位置
boolean markSupported() 判斷此流是否支援mark()操作
int read() 從檔案中讀取單個字元
int read(char[] cbuf) 從檔案中讀取字元到cbuf
abstract int read(char[] cbuf, int off, int len) 將檔案中的字元讀入cbuf陣列,從off位置開始,讀取len個字元。三個read方法在字元可用、發生I/O異常或者已經到達流的末尾前,此方法會一直阻塞
int read(CharBuffer target) 試圖將檔案中的字元讀入指定的字元緩衝區
boolean ready() 判斷是否準備讀取此流
voi reset() 重置該流
long skip(long n) 跳過n個字元

 

Writer

Writer是定義字元輸出流的抽象類,所有該類的方法都返回一個void值並在出錯的條件下引發IOException。Writer類中的方法有:

方    法 作    用
Writer append(char c) 將制定字元新增到此writer
Writer append(CharSequence csq) 將制定字元序列新增到此writer
Writer append(CharSequence csq, int start, int end) 將指定字元序列的子序列新增到此writer.Appendable
abstract void close() 關閉此流,但要先flush()它
abstract void flush() 重新整理該流的緩衝
void write(char[] cbuf) 將cbuf中的內容寫入檔案
abstract void write(char[] cbuf, int off, int len) 將字元陣列cbuf中從off開始的len個位元組寫入檔案
void write(int c) 寫入單個字元到檔案中
void write(String str) 寫入字串到檔案中
void write(String str, int off, int len) 寫入str從off位置開始的len個字元到檔案中

 

FileReader和FileWriter

FileReader類建立了一個可以讀取檔案內容的Reader類,最常用的構造方法是:

1、FileReader(String fileName)

2、FileReader(File file)

FileWriter建立了一個可以寫檔案的Writer類,最常用的構造方法是:

1、FileWriter(String fileName)

2、FileWriter(String fileName, boolean append)

3、FileWriter(File file)

其中第二個構造方法,如果append為true,那麼輸出是追加到檔案結尾的FileWriter類的建立不依賴檔案是否存在,在建立檔案之前,FileWriter將在建立物件時開啟它來作為輸出。如果試圖開啟一個只讀檔案,那麼將引發一個IOException。看一下FileWriter和FileReader的使用,現在D盤目錄下沒有"writer.txt":

public static void main(String[] args) throws Exception
{
    File file = new File("D:/writer.txt");
    Writer out = new FileWriter(file);
    // 宣告一個String型別物件
    String str = "Hello World!!!";
    out.write(str);
    out.close();
        
    // 讀檔案操作
    Reader in = new FileReader(file);
    // 開闢一個空間用於接收檔案讀進來的資料
    char c0[] = new char[1024];
    int i = 0;
    // 將c0的引用傳遞到read()方法之中,同時此方法返回讀入資料的個數
    i = in.read(c0);
    in.close();
        
    if (-1 == i)
    {
        System.out.println("檔案中無資料");
    }
    else
    {
        System.out.println(new String(c0, 0, i));
    }
}

利用FileWriter和FileReader進行了一次的讀寫操作,先看一下D盤下是否有"writer.txt",假如有"writer.txt"那"writer.txt"中又是什麼:

看來利用FileWriter寫入一個記憶體中的字串到檔案中是成功了,那麼利用利用FileReader讀入檔案中的內容到記憶體呢,看一下執行結果:

Hello World!!!

列印結果和檔案中的內容一致,說明FileReader的操作也成功。

這就是FileWriter和FileReader的使用,和FileOutputStream和FileInputStream的使用差不多,不過實際操作中一般不會用FileWriter和FileReader,這將在下一篇文章進行講解。

相關文章