Java IO學習筆記八

  • 2019 年 12 月 31 日
  • 筆記

文章目錄

  1. 1. BufferedReader和BufferedWriter
    1. 1.1. BufferedReader
      1. 1.1.1. 構造函數
        1. 1.1.1.1. 實例
      2. 1.1.2. 常用方法
        1. 1.1.2.1. 實例
    2. 1.2. BufferedWriter
      1. 1.2.1. 構造函數
      2. 1.2.2. 常用函數
      3. 1.2.3. 實例
    3. 1.3. 綜合實例
    4. 1.4. 參考文章

BufferedReader和BufferedWriter

  • 這兩個類是高效率的提高文件的讀取速度,它們為字元輸入和輸出提供了一個緩衝區,可以顯著的調高寫入和讀取的速度,特別針對大量的磁碟文件讀取的時候,下面著重的講講這兩個類

BufferedReader

  • 從字元輸入流中讀取文本,緩衝各個字元,從而實現字元、數組和行的高效讀取,要特別注意的是這個市針對字元流而不是位元組流。
  • 通常,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()
  • String readLine() 讀取一行的數據
  • int read() 讀取一個字元,注意這裡的和位元組的不一樣,這裡的漢字佔用了一個位元組,前面講到讀取位元組流的時候使用byte讀取漢字佔用三個位元組
  • skip(int n) 跳過n個位元組
  • 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();          }    		//第三種方式,根據readLine讀取一行,如果到達了文件的末尾返回null  		String s;  		while((s=bufferedReader.readLine())!=null)  		{  			System.out.println(S);  		}

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();          }  }

參考文章