------------siwuxie095
工程名:TestRWBufferedCharStream
包名:com.siwuxie095.bufferedcharstream
類名:RWByBufferedCharStream.java
打開資源管理器,在工程 TestRWBufferedCharStream 文件夾下,放入
一個文本:java.txt
java.txt 的內容:
工程結構目錄如下:
代碼:
package com.siwuxie095.bufferedcharstream;
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException;
public class RWByBufferedCharStream {
/** * 使用帶有緩沖的字符流實現文本文件的數據讀寫 * * InputStreamReader 沒有讀取一行數據的方法 * OutputStreamWriter 沒有寫入一行數據后自動換行的方法 * 所以有一定的局限性 * * 使用帶有緩沖的字符流就可以解決 * * InputStreamReader 和 BufferedReader 的API區別: * InputStreamReader 有 4 個 read() 方法,BufferedReader 則多出一個 readLine() * readLine() 每讀取到一個換行的時候,此函數就會結束,並將這一行數據返回 * * OutputStreamWriter 和 BufferedWriter 的API區別: * OutputStreamWriter 有 5 個 write() 方法,BufferedWriter 同樣是這 5 個方法 * BufferedWriter 的優勢在於其寫出的操作是帶有緩沖的,在 BufferedWriter 內部 * 有一個自帶的緩沖區,當文件寫出的時候,會先寫入到這個緩沖區,當緩沖區被寫滿 * 之后才會向硬盤執行一次真正的寫出操作,這樣就大大減少了硬盤的使用量,延長了 * 硬盤的使用壽命,整體的寫出時間也會變短,增加了寫入效率 * * * 在使用緩沖流寫出數據時要注意一點: * 到文件末尾時如果寫出的數據還沒有填滿緩沖區,緩沖區里的內容有些時候是不會被 * 寫入到文件里的。導致文件內容丟失 或 不完整,所以在緩沖流 close() 之前,要調 * 用輸出流的 flush()方法,將當前的緩沖區里的內容強制輸出,不留遺漏,保證文件 * 內容的完整 * * @param args */ public static void main(String[] args) {
try {
// 先創建一個文件對象 File file = new File("java.txt"); // 再創建一個文件輸入流(字節流),傳入 file FileInputStream fis = new FileInputStream(file); // 使用 InputStreamReader 將字節流轉化為字符流 // 傳入 fis 並指定字符集:UTF-8 InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); // 繼續包裝成帶緩沖的字符流,傳入Reader對象:isr BufferedReader br = new BufferedReader(isr);
// 文件的輸出流會自動創建文件 java_buff.txt,不需要手動創建 FileOutputStream fos = new FileOutputStream("java_buff.txt"); // 在對同一個文件進行讀寫 或 對同一段數據操作時,其編碼設定一定要一致 OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); BufferedWriter bw = new BufferedWriter(osw);
// 打印流,其方法和 BufferedWriter 相似,傳入一個Writer對象:osw // PrintWriter 還可以設置自動執行 flush 操作,不用手動去 pw.flush() //PrintWriter pw=new PrintWriter(osw,true); PrintWriter pw=new PrintWriter(osw);
String input;
// 如果 readLine() 的返回值是 null,則讀取到了文件末尾 while ((input = br.readLine()) != null) { System.out.println(input); // 將 String:input 寫入到文件 java_buff.txt,但是會丟失所有的換行符 // 這是因為使用 BufferedReader 的 readLine()方法來讀取一行數據時, // 雖然讀取的是一行數據,返回值中卻並不包含換行符,所以在寫入文件 // 時就只能寫入每一行的真實內容,而沒有換行符,最后就只有一行了 // 可以手動加入一個換行符 bw.write(input + "\n");
// 或者 使用另一個API:PrintWriter,來保留換行符 // PrintWriter 的 write() 方法和BufferedWriter、OutputStreamWriter一樣 // 除此之外,PrintWriter 還提供了特殊的寫出方法,即 print() println() // 特別是 printline 寫出數據時會在當前字符串末尾添加一個換行符 //pw.println(input); }
//關閉緩沖流之前,執行輸出流的 flush 操作 bw.flush(); //pw.flush();
// 讀寫完畢,關閉流 br.close(); isr.close(); fis.close(); pw.close(); bw.close(); osw.close(); fos.close();
} catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
} |
運行一覽:
java_buff.txt 的內容:
運行后,工程結構目錄一覽:
【made by siwuxie095】
