Java IO學習筆記八

BufferedReader和BufferedWriter

  • 這兩個類是高效率的提升文件的讀取速度,它們爲字符輸入和輸出提供了一個緩衝區,能夠顯著的調高寫入和讀取的速度,特別針對大量的磁盤文件讀取的時候,下面着重的講講這兩個類html

BufferedReader

  • 從字符輸入流中讀取文本,緩衝各個字符,從而實現字符、數組和行的高效讀取,要特別注意的是這個市針對字符流而不是字節流。java

  • 一般,Reader 所做的每一個讀取請求都會致使對底層字符或字節流進行相應的讀取請求。所以,建議用 BufferedReader 包裝全部其 read() 操做可能開銷很高的 Reader(如 FileReaderInputStreamReader數組

構造函數

  • BufferedReader(Reader in) 建立一個使用默認大小輸入緩衝區的緩衝字符輸入流。函數

  • BufferedReader(Reader in, int sz) 建立一個使用指定大小輸入緩衝區的緩衝字符輸入流。學習

實例

  • 能夠看出構造函數使用了Reader這個抽象類來初始化,咱們前面說過這個是針對字符流的讀取,所以可使用Reader類的兩個子類FileReader,InputStreamReader來初始化操作系統

File file=new File("/tmp"+File.separator+"test"+File.separator+"test.txt");
BufferedReader bufferedReader=new BufferedReader(new FileReader(file));  //使用FileReader實例化
//使用InputStreamReader來實例化
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream(file)));

經常使用方法

  • close() code

  • String readLine() 讀取一行的數據htm

  • int read() 讀取一個字符,注意這裏的和字節的不同,這裏的漢字佔用了一個字節,前面講到讀取字節流的時候使用byte讀取漢字佔用三個字節blog

  • skip(int n) 跳過n個字節ip

  • ready() 判斷此流是否已準備好被讀取。

實例

  • 用於控制檯的讀取,前面已經說過System.in返回的是InputStream類型的,所以可使用InputStreamReader實例化,固然這個有點多餘了,咱們徹底可使用java.util提供的Scanner直接進行輸入

BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
        String str=bufferedReader.readLine();  //將控制檯輸入的字符串讀取
        System.out.println(str);  //打印出來
  • 用於文件的讀取

BufferedReader bufferedReader=new BufferedReader(new FileReader(file));
       // BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream(file)));
//        bufferedReader.skip(2);    //跳過兩個字節
//        
//        第一種讀取的方式
        while(bufferedReader.ready())     //判斷是否還有字符
        {
            String str=bufferedReader.readLine();   //直接讀取一行
            System.out.println(str);  
        }
        bufferedReader.close();
        
        //第二種讀取方式
        int len=bufferedReader.read();
        while(len!=-1)   //判斷是否讀到文件的末尾
        {
            System.out.print((char)len);  //強制轉化成字符
            len=bufferedReader.read();
        }

BufferedWriter

  • 將文本寫入字符輸出流,緩衝各個字符,從而提供單個字符、數組和字符串的高效寫入。

  • 一般 Writer 將其輸出當即發送到底層字符或字節流。除非要求提示輸出,不然建議用 BufferedWriter 包裝全部其 write() 操做可能開銷很高的 Writer(如 FileWritersOutputStreamWriters)。例如

PrintWriter out
   = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

構造函數

  • BufferedWriter(Writer out) 建立一個使用默認大小輸出緩衝區的緩衝字符輸出流。

  • BufferedWriter(Writer out, int sz) 建立一個使用給定大小輸出緩衝區的新緩衝字符輸出流。

File file=new File("/tmp"+File.separator+"test"+File.separator+"test.txt");
BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter(file));

注意這裏的FileWriter是Writer的子類,所以可使用其實例化

經常使用函數

  • close()

  • flush()

  • newLine() 寫入一個與平臺相關的換行符

  • write(int data) 寫入一個字符,這裏的寫入的不是整數

  • write(String str) 寫入一個字符串

  • write(String str,int off,int len) 寫入部分字符串

  • write(char[] c)

  • write(char[] c,int off,int len)

實例

File file=new File("/tmp"+File.separator+"test"+File.separator+"test.txt");
        File file1=new File("/tmp"+File.separator+"test");
        File file2=new File("/tmp"+File.separator+"test"+File.separator+"demo.txt");
        if(!file1.exists())
        {
            file1.mkdir();
            System.out.println("文件夾建立成功");
        }
        BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter(file));
        String str="陳加兵";
        int data=48;
        String name="chenjiabing";
        char[] chars=name.toCharArray();
        bufferedWriter.write(str);   //寫入一個字符串,固然也能夠截取這個字符串的某一段
        bufferedWriter.newLine();  //寫入一個平臺自帶的換行符,由於每個操做系統的換行符都不同
        bufferedWriter.write(data);   //寫入的並非整數,而是這個整數所表明的字符
        bufferedWriter.newLine();
        bufferedWriter.write(chars,1,4);  //寫入字符數組
        bufferedWriter.flush();
        bufferedWriter.close()

拓展:經過了上面的學習,你不以爲使用這個類寫入文件數據有點煩了,只能寫入String char類型的數據,此時咱們就想到了前面說過的打印流(PrintWriter),這是一個便捷的寫入文件的類,能夠指定任意格式任意類型的數據,一樣是輸出流,我麼能夠將他們結合起來,構成一個更增強大的輸出流,以下:

File file=new File("/tmp"+File.separator+"test"+File.separator+"test.txt");
        //用BufferedWriter實例化PrintWriter,顯著提升寫入的效率
        PrintWriter printWriter=new PrintWriter(new BufferedWriter(new FileWriter(file)));
        String name="陳加兵";
        int age=22;
        float grade=99.9f;
        printWriter.printf("姓名:%s,年齡:%s,grade:%s",name,age,grade);  //格式化的寫入
        printWriter.close();

綜合實例

將一個文件中數據轉移到另一個文件中

package IO;

import java.io.*;

/**
 * Created by chenjiabing on 17-5-26.
 */
public class demo13 {

    /**
     * 經常使用函數:
     * newLine()
     * write(String str)
     * write(String str,int off,int len)
     * write(Char[] c)
     * write(Char[] c,int off,int len)
     * write(int data)
     * close()
     * flush()
     */
    public static void main(String[] args) throws IOException {
        File file = new File("/tmp" + File.separator + "test" + File.separator + "test.txt");
        File file1 = new File("/tmp" + File.separator + "test");
        File file2 = new File("/tmp" + File.separator + "test" + File.separator + "demo.txt");
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file2));
        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));

        while (bufferedReader.ready()) {
            String str = bufferedReader.readLine();  //讀取文件test.txt中的一行數據
            bufferedWriter.write(str);   //將這一行數據寫入文件demo.txt
            bufferedWriter.newLine();
        }
        bufferedReader.close();
        bufferedWriter.flush();
        bufferedWriter.close();


    }
}

參考文章

相關文章
相關標籤/搜索