黑馬程序員_

--------------------ASP.Net+Android+IOS開發.Net培訓、期待與您交流! --------------------


1.BufferedWriter

     

    BufferedWriter是利用的緩衝技術,操作的是輸入流,把Writer對象構造函數的參數傳入,首先是把信息讀取到緩衝流中,然後再刷新緩衝流,把讀到的文件信息傳到目的地。這提高了寫入的效率。

   這裏寫入的方法增加了newLine()方法,換行,這個是跨平臺的操作,不用在寫”\r\n”,當關閉緩衝流,同時也關閉了緩衝流中封裝的輸入字符流。

 

緩衝區都有自己默認的長度,也可以自己設定長度,一般情況下,默認長度據夠用了

 

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
 
public class BufferedDemo {
  public static void main(String[] args) {
    FileWriter fw=null;//字符流  輸入流
    BufferedWriter bw=null;//緩衝流
    try {
       fw=new FileWriter("F:\\demo.txt");
       bw=new BufferedWriter(fw);//將字符流封裝到緩衝流中
      for(int i=0;i<3;i++){
          bw.write("java0"+i);
          bw.newLine();//換行
          bw.flush();
       }
    } catch (IOException e) {
      e.printStackTrace();
    }finally{
      if(bw!=null){
         try {
           /*關閉緩衝流,同時也關閉了裏面封裝的字符流,不需要在關閉字符流,fw*/
           bw.close();
         } catch (IOException e) {
           e.printStackTrace();
         }
      }
    }
 
  }
 
}
 


2.BufferedReader

     1. 概述

             讀取緩衝流,將字符流的讀取流傳到BufferedReader對象的構造方法中,這樣可以提高效率,在讀取方面,除了一個一個字節讀取和數組讀取,增加了讀行方法,   readLine(),

 

     緩衝區都有自己默認的長度,也可以自己設定長度,一般情況下,默認長度據夠用了

 

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
 
public class BufferedDemo1 {
  public static void main(String[] args) {
    FileReader fr=null;//字符流輸出流
    BufferedReader br=null;//緩衝流
    try {
      fr=new FileReader("F:\\demo.txt");
      br=new BufferedReader(fr);
      /*String readLine()當讀取到末尾的時候,返回null
       * 否則返回的是一行的數據*/
      String line=null;
      while((line=br.readLine())!=null){
         System.out.println(line);
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }catch(IOException e1){
      e1.printStackTrace();
    }finally{
      if(br!=null){
         try {
           /*關閉緩衝流,同時也關閉了裏面的字符流,不需要在關閉字符流*/
           br.close();
         } catch (IOException e) {
           e.printStackTrace();
         }
      }
    }
 
  }
 
}
結果:
java00
java01
java02


          2.readLine原理

 

     其實這是裝飾類,用了裝飾設計模式,詳細參考    黑馬程序員_<<裝飾設計模式>>



模擬換行

 

    

 import java.io.FileReader;
import java.io.IOException;
 
public class MyBufferedReader {
  private FileReader fr = null;
 
  public MyBufferedReader(FileReader fr) {
    super();
    this.fr = fr;
  }
 
  /* 模擬readLine的話,其實裏面封裝了一個數組,我們爲了方便,就封裝StringBuilder對象,這樣操作方便 */
 
  public String readLine() throws IOException {
    StringBuilder sb = new StringBuilder();
    int ch = -1;
    while ((ch = fr.read()) != -1) {
      //System.out.print(ch+",");  從輸入的個數判斷出
      if (ch == '\r')//當文件中就存在\r,那此時是否存入StringBuilder中呢,開始我認爲是不會存入的,但是結果輸出了,難道是讀取的時候例如:\r,把\ 和 r分開讀取了,這樣理解的話,就通順了
         continue;
      if (ch == '\n')//這裏和\r的疑問和理解一樣
         return sb.toString();
      else
         sb.append((char) ch);
 
    }
    if (sb.length() != 0)// 這裏解決了,最後一樣沒有回車,防止最後一行不被輸出
      return sb.toString();
    return null;
  }
 
  public void close() throws IOException {
    if (fr != null) {
      fr.close();
    }
  }
}
 
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.Date;
importjava.util.Random;
 
public classClassDemo {
      public static void main(String[] args) {
 
           MyBufferedReader br = null;// 緩衝流
           try {
                 br = new MyBufferedReader(newFileReader("F:\\demo.txt"));
 
                 String line = null;
                 while ((line = br.readLine())!= null) {
                      System.out.println(line);
                 }
           } catch (FileNotFoundException e) {
                 e.printStackTrace();
           } catch (IOException e) {
                 e.printStackTrace();
           } finally {
                 if (br != null) {
                      try {
                            br.close();
                      } catch (IOException e) {
                            e.printStackTrace();
                      }
                 }
           }
      }
 
}

結果正確輸出。

           

3. 緩衝技術(複製文件)

 

   

package www.fuxi.IO;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
 
public class BufferedClass {
 
  public static void main(String[] args) {
    BufferedReader br = null;// 緩衝流讀取
    BufferedWriter bw = null;// 緩衝流寫入
    try {
      /* 在這裏使用匿名類,因爲關閉的不需要字符流對象,直接把對象封裝到了緩衝流中了 */
      br = new BufferedReader(new FileReader("F:\\demo.txt"));
      bw = new BufferedWriter(new FileWriter("F:\\A\\demo.txt"));
      String line=null;
      while((line=br.readLine())!=null){//讀取
         bw.write(line);//寫入
         bw.newLine();//換行
         bw.flush();//刷新
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
 
      try {
         if (bw != null) {
           bw.close();
         }
         if (br != null) {
           br.close();
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
 
    }
 
  }
 
}

 

4. LineNumberReader

       1. 概述

這也是一個裝飾類。繼承了BufferedReader類(這也是一個裝飾了類),重寫了ReadLine方法,增加了行號的設置和獲得。

public class LineNumberDemo{
  public static void main(String[] args) {
    LineNumberReader lnr = null;
 
    try {
      lnr = new LineNumberReader(new FileReader("F:\\ClassDemo.java"));
      String line = null;
      lnr.setLineNumber(10);//在這裏也可以自己設置行號的開始
      while ((line = lnr.readLine()) != null) {
        System.out.println(lnr.getLineNumber()+":"+line);
      }
    } catch (FileNotFoundException e) {
      System.out.println("沒有找到指定的文件");
    } catch (IOException e) {
      System.out.println("讀取失敗");
    } finally {
      if (lnr != null) {
         try {
           lnr.close();
         } catch (IOException e) {
           System.out.println("流關閉失敗");
         }
      }
    }
 
  }
 
}
 
部分結果:
11:package www.fuxi.IO;
12:
13:importjava.io.FileNotFoundException;
14:import java.io.FileReader;
15:import java.io.IOException;
16:
17:public class ClassDemo {
18: public static void main(String[] args) {
19:
20:   MyBufferedReaderbr = null;// 緩衝流



        2. 模擬此類

自己不需要寫readLine的原理,直接調用父類的方法即可,然後增加行號的設置和獲得。

 

 

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.Reader;
/*自定義的可以設置行號讀取類*/
public class MyLineNumberReader extends BufferedReader {
 
  private Reader r;// 讀取流字符流
  private int LineNumber;// 行號
 
  public MyLineNumberReader(Reader r) {
    super(r);// 父類的構造方法
  }
 
  public int getLineNumber() {
    return LineNumber;
  }
 
  public void setLineNumber(int lineNumber) {
    LineNumber = lineNumber;
  }
 
  public String readLine() throws IOException {
    this.LineNumber++;// 每讀取一行,行號就增加
    return super.readLine();
  }
 
  public void close() throws IOException {
    super.close();
  }
 
}
 
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
 
public class LineNumberDemo {
  public static void main(String[] args) {
    MyLineNumberReader lnr = null;
 
    try {
      lnr = new MyLineNumberReader(new FileReader("F:\\ClassDemo.java"));
      String line = null;
      //lnr.setLineNumber(10);//在這裏也可以自己設置行號的開始  默認的是從1開始
      while ((line = lnr.readLine()) != null) {
        System.out.println(lnr.getLineNumber()+":"+line);
      }
    } catch (FileNotFoundException e) {
      System.out.println("沒有找到指定的文件");
    } catch (IOExceptione) {
      System.out.println("讀取失敗");
    } finally {
      if (lnr != null) {
         try {
           lnr.close();
         } catch (IOException e) {
           System.out.println("流關閉失敗");
         }
      }
    }
 
  }
 
}
 
部分結果:
1:package www.fuxi.IO;
2:
3:importjava.io.FileNotFoundException;
4:import java.io.FileReader;
5:import java.io.IOException;
6:
7:public class ClassDemo {
8:  public static void main(String[]args) {


--------------------ASP.Net+Android+IOS開發.Net培訓、期待與您交流! --------------------

 


發佈了46 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章