--------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------
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(); } } } } }
读取缓冲流,将字符流的读取流传到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
其实这是装饰类,用了装饰设计模式,详细参考 黑马程序员_<<装饰设计模式>>
模拟换行
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(); } } } } }
结果正确输出。
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(); } } } }
这也是一个装饰类。继承了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;// 缓冲流
自己不需要写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培训、期待与您交流! --------------------