【Java】BufferedReader / BufferedWriter

本篇將說明 有緩衝區的讀、寫檔 (BufferedReader、BufferedWriter) 的基礎用法。


BufferedWriter


BufferedWriter FileWriter 都是寫檔的 class,差別只在於一個有緩衝一個沒有緩衝,而最直接的差別就是效率的問題。
will buffer the PrintWriter's output to the file. Without buffering, each invocation of a print() method would cause characters to be converted into bytes that would then be written immediately to the file, which can be very inefficient.

FileWriter 只要呼叫 write 的 function 的時候就會直接輸出在檔案上。
BufferedWriter 會在緩衝區累積到一定的量在一起輸出在檔案上。
目的就是要減少 IO 的次數,IO 是很耗時的,小檔案不明顯,可以試試大一點的檔案會很有 fu,總之有 Buffer 就是讚~

而 BufferedWriter 多一些 function 可以用。
  • void flush() -> 直接把緩衝區的資料輸出在檔案上。
  • void newLine() -> 終止此行,換下一行。大多情況下等同於 "\n",而有些情況不吃 "\n",輸出的時候需要注意一下。

附上簡單的寫檔 function
    public void bufferedWriteFile(String path, String content1, String content2)
    {
        try
        {
            FileWriter writer = new FileWriter(path);
            BufferedWriter bufferedWriter = new BufferedWriter(writer);
            bufferedWriter.write(content1);
            bufferedWriter.newLine();
            bufferedWriter.write(content2);
            bufferedWriter.flush();
            bufferedWriter.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }


BufferedReader


BufferedReader FileReader 都是讀檔的 class,差別只在於一個有緩衝一個沒有緩衝,而最直接的差別也是效率的問題。
Without buffering, each invocation of read() or readLine() could cause bytes to be read from the file, converted into characters, and then returned, which can be very inefficient.

FileReader 在沒有 Buffer 的形況之下,在 read 時會一個一個讀取轉換再回傳,這是相當沒效率的事情。

而 BufferedReader 多一些 function 可以用。
  • String readLine() -> 超好用的,一次讀一行。
  • long skip(long n) -> 跳過字元

附上簡單讀檔 function。
    public void bufferedReadFile(String path)
    {
        try
        {
            FileReader reader = new FileReader(path);
            BufferedReader bufferedReader = new BufferedReader(reader);
            String line;
            while ((line = bufferedReader.readLine()) != null)
                System.out.println(line);
            bufferedReader.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
總之有 Buffer 就用 Buffer 效率就是比較好 !!
本篇參考
  1. BufferedWriter
  2. BufferedReader

留言