天天看點

Java基礎知識IO流(BufferedWriter&BufferedReader)

  • 緩沖區
  • 字元的緩沖區
  • BufferedWriter
  • BufferedReader
  • 練習
  • readLine()方法原理介紹

緩沖區:

什麼是緩沖區?

就像人喝水時,不會從飲水機裡一滴一滴地喝水,而是用一個杯子接滿了之後再喝。這時杯子就相當于一個緩存區,提高了喝水的效率。

其實很多軟體都有其緩沖技術,比如下載下傳軟體,在下載下傳的過程中都有緩沖區,從伺服器端拿到資料之後,先存放在記憶體當中,當記憶體中的資料達到一定量之後,再寫到硬碟上去,否則如果從服務端拿到一個資料就到硬碟寫一次,頻繁的擦寫操作,效率很低。

字元的緩沖區

對于字元流來說為了提高對資料的讀寫效率,引入了字元流體系中的緩沖區技術,并提供了對應的緩沖區對象。

對應類:

  • BufferedWriter 具有緩沖技術的寫入字元流
  • BufferedReader具有緩沖技術的讀取字元流

BufferedWriter:

将文本寫入字元輸出流,緩沖各個字元,進而提供單個字元、數組和字元串的高效寫入。

構造方法:

BufferedWriter(Writer out)

建立一個使用預設大小輸出緩沖區的緩沖字元輸出流。

BufferedWriter(Writer out, int sz)

建立一個使用給定大小輸出緩沖區的新緩沖字元輸出流。

注:BufferedWriter的緩沖原理就是将Writer對象和數組對象封裝到對象裡面,是以構造方法中都有Writer對象。

代碼注釋:

  1. 建立一個字元寫入流對象
  2. 為了提高字元寫入流效率,加入緩沖技術,隻要将需要被提高效率的流對象作為參數傳遞給緩沖區的構造函數即可。
  3. 緩沖寫入流中提供了一個跨平台的換行方法:newLine()

    Why? Because在不同系統平台上的換行符是不一樣的,windows的換行符是\r\n,Linux的換行符是\n。為了實作跨平台,提供了newLine()方法,原理就是先判斷是什麼系統,然後調用write()方法,寫入\r\n或者\n。

import java.io.*;

class day1901 
{
    public static void main(String[] args) 
    {
        FileWriter fw=null;
        BufferedWriter bfw=null;
        try
        {
            fw=new FileWriter("DemoTxt.txt");
            bfw=new BufferedWriter(fw);
            for(int i=;i<;i++)
            {
                bfw.write("abcd"+i);
                bfw.newLine();
                fw.flush();
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if(bfw!=null)
                    bfw.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }


    }
}
           
Java基礎知識IO流(BufferedWriter&amp;BufferedReader)

BufferedReader:

從字元輸入流中讀取文本,緩沖各個字元,進而實作字元、數組和行的高效讀取。

構造方法:

BufferedReader(Reader in)

建立一個使用預設大小輸入緩沖區的緩沖字元輸入流。

BufferedReader(Reader in, int sz)

建立一個使用指定大小輸入緩沖區的緩沖字元輸入流。

BufferedReader提供了一個新的讀取文本的方法:

讀取一個文本行。通過下列字元之一即可認為某行已終止:換行 (‘\n’)、回車 (‘\r’) 或回車後直接跟着換行。

傳回:

包含該行内容的字元串,不包含任何行終止符,如果已到達流末尾,則傳回 null

抛出:

IOException - 如果發生 I/O 錯誤

例子:讀取DemoTxt.txt檔案中的字元,并輸出在控制台上。

import java.io.*;

class day1902 
{
    public static void main(String[] args) 
    {
        FileReader fr=null;
        BufferedReader bur=null;
        try
        {
            fr=new FileReader("DemoTxt.txt");
            bur=new BufferedReader(fr);

            String line=null;
            while((line=bur.readLine())!=null)
            {
                System.out.println(line);
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if(bur!=null)
                    bur.close();
            }
            catch (IOException e)
        {
            e.printStackTrace();
        }
        }
    }
}
           
Java基礎知識IO流(BufferedWriter&amp;BufferedReader)

練習

要求:使用緩存的方法複制DemoTxt.txt檔案的内容,寫入DemoTxt2.txt内。

import java.io.*;

class CopyTextByBuf 
{
    public static void main(String[] args) 
    {
        BufferedReader bur=null;
        BufferedWriter buw=null;
        try
        {
            bur=new BufferedReader(new FileReader("DemoTxt.txt"));
            buw=new BufferedWriter(new FileWriter("DemoTxt2.txt"));

            String line=null;
            while((line=bur.readLine())!=null)
            {
                buw.write(line);
                buw.newLine();
                buw.flush();
            }
        }
        catch (IOException e)
        {
            throw new RuntimeException("複制失敗");
        }
        finally
        {
            try
            {
                if(bur!=null)
                    bur.close();
            }
            catch (IOException e)
            {
                throw new RuntimeException("寫入流關閉失敗");
            }

            try
            {
                if(buw!=null)
                    buw.close();
            }
            catch (IOException e)
            {
                throw new RuntimeException("讀取流關閉失敗");
            }
        }
    }
}
           

readLine()原理

其實緩存區無論是讀一行,還是擷取多個字元,其實最終都是在硬碟上一個一個讀取,最終使用的還是read()方法一次讀一個的方法。

readLine()方法,讀取一行的字元,原理也是調用read()方法,一個一個地讀,隻是在讀硬碟檔案的過程中,在記憶體中臨時建立數組,将讀取的字元存放到數組中,直到讀取到\r\n換行符,再将數組中的内容傳給字元串。然後根據代碼再讀下一行。

圖例如下:

Java基礎知識IO流(BufferedWriter&amp;BufferedReader)