字符流
字節流提供了處理任何類型輸入/輸出操作的功能(因為對於計算機而言,一切都是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,這將在下一篇文章進行講解。
