“嗨,阿米戈,又來了。”

“你好,Rishi。今天的課程是什麼?”

“今天我要給大家介紹一下 Reader 和 Writer。”

“但是,Rishi,我幾乎已經了解了他們的一切!”

“重複是學習之母”。

“嗯。嗯,好的。”

ReaderWriter類似於InputStreamOutputStream,但它們處理的是字符,而不是字節。有時它們也被稱為字符流,而不是 InputStream 和 OutputStream,它們被稱為字節流。”

“一個是字符的,另一個是字節的。我記得。”

“不僅如此。這些類是專門為處理文本和字符串而設計的。今天我們將看看這些抽像類的兩個經典實現:FileReaderFileWriter。”

“這是FileReader類的方法:”

方法 描述
int read() 從流中讀取一個字符並將其返回。
int read(char cbuf[], int offset, int length) 讀取字符數組,返回讀取的字符數。
boolean ready() 如果可以從流中讀取,則返回 true。
void close() 關閉輸入流。
int read(java.nio.CharBuffer target) 將一組字符讀入緩衝區。
int read(char cbuf[]) 讀取字符數組。
long skip(long n) 跳過流中的 n 個字符。
String getEncoding() 返回流的當前編碼。

“好吧,這些我幾乎都知道。但是 FileWriter 呢?”

方法 描述
void write(int c) 將一個字符寫入流。
void write(char cbuf[], int off, int len) 將字符數組寫入流。
void write(char cbuf[]) 將字符數組寫入流。
void write(String str, int off, int len) 將字符串的一部分寫入流。
void write(String str) 將字符串寫入流。
void flush() 將緩存在內存中的所有內容寫入磁盤。
void close() 關閉流。
String getEncoding() 返回流的當前編碼。

“我知道!”

“太好了,那我們再來看一個有趣的例子,等下迭戈會給你佈置更多的任務。”

“如何逐行讀取文件?你會寫代碼嗎?”

“簡單,看:”

代碼
// Create a list for storing the lines
List<String> list = new ArrayList<String>();

// Open the file
File file = new File("c:/document.txt");
BufferedReader reader = new BufferedReader(new FileReader(file));

// As long as the file isn't empty, read from it
while (reader.ready())
{
 list.add(reader.readLine());
}

// Close the file
reader.close();

“嗯。不錯。”

“還不錯?一切都很簡單,也很漂亮。承認吧,Rishi——我已經對 I/O 線程有了很好的掌握。那麼這裡還有什麼可以改進的嗎?”

“好吧,例如,你可以這樣做:”

Rishi 的代碼
File file = new File("c:/document.txt");

List list = Files.readAllLines(file.toPath(), Charset.defaultCharset());

“嗯。那就更短了。就在今天,你把所有這些方法都告訴了我。我會重寫它。謝謝你的教訓,Rishi。”

“祝你好運,阿米戈。”