------<ahref="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
黑马程序员——21,字符流FileReader,FileWriter,BufferedWriter,BufferedReader,装饰设计模式,LineNumberReader
/*
字符流的缓冲区技术:
对于一些大文件,如果读取一个字符才写一个字符,读写操作过于频繁。
为了解决这个问题,引入了缓冲区技术。
缓冲区技术是在流的基础上(必须要先有流)增强了流对于数据的操作效率。
就如同在水龙头上拿水喝,原本是一滴一滴喝的,但是现在用了一个杯子装着来喝,更有效率。
*/
import java.io.*; class Ioliou7 { public static void main(String[] args) { FileWriter fw=null; BufferedWriter bfw=null; try { fw=new FileWriter("f:\\yuyuyu.txt"); bfw=new BufferedWriter(fw); //把写入流对象传给缓冲区构造函数 bfw.write("假面骑士01号登场!"); //实际上把字符写入流的还是fw调用底层资源实现的 bfw.newLine(); //换行 bfw.write("假面骑士02号登场!"); bfw.flush(); //这里还是要刷新才把存在流的数据传倒文件里面 } catch(IOException e) { throw new RuntimeException("写操作有误"); } finally { try { if(bfw!=null) { bfw.close(); //关闭流, /* bfw.close();本质上关闭流的还是fw底层调用close()方法实现的, 所以就不用再写fw.close();了 */ } } catch(IOException e) { throw new RuntimeException("bfw.close();出问题抛出异常了"); } } } public static void soc(Object obj) { System.out.println(obj); } }
——————分割线——————
/*
字符流的读取缓冲区技术
BufferedReader
*/
import java.io.*; class Ioliou8 { publicstatic void main(String[] args) { FileReader fr=null; BufferedReader bfr=null; try { fr=new FileReader("e:\\JAVAwenjian\\Ioliou8.java"); bfr=new BufferedReader(fr); String s=null; while((s=bfr.readLine())!=null) /* readLine()一行一行的读取,不包含任何行终止符,如果没有数据读取就返回null, 但是不返回回车符,所以输出打印或者写入的时候要记得换行。 readLine读取数据本质上还是要调用read方法一个一个读取的 */ { soc(s); } } catch(IOException e) { throw new RuntimeException("读操作出问题"); } finally { try { if(bfr!=null) bfr.close(); } catch (IOException e) { throw new RuntimeException("读操作出问题"); } } } public static void soc(Object obj) { System.out.println(obj); } }
————————分割线————
/*
字符流利用缓冲区进行复制操作文件
把e:\\JAVAwenjian\\Ioliou8.java复制到d盘中。
*/
import java.io.*; class Ioliou9 { public static void main(String[] args) { FileWriter fw=null; FileReader fr=null; BufferedWriter bfw=null; BufferedReader bfr=null; try { fw=new FileWriter("d:\\Ioliou8_copy.java");//建立字符流写入对象 fr=new FileReader("e:\\JAVAwenjian\\Ioliou8.java");//建立字符流读取对象 bfw=new BufferedWriter(fw);//建立字符流写入缓冲区 bfr=new BufferedReader(fr);//建立字符流读取缓冲区 String s=" "; while((s=bfr.readLine())!=null) { bfw.write(s); bfw.newLine();//换行 } } catch (IOException e) { throw new RuntimeException("复制操作出问题"); } finally { try { if(bfw!=null) bfw.close(); } catch(IOException e) { throw new RuntimeException(" bfw.close();出问题"); } try { if(bfr!=null) bfr.close(); } catch (IOException e2) { throw new RuntimeException("bfr.close();出问题"); } } } public static void soc(Object obj) { System.out.println(obj); } }
————————分割线——————
/*
建立一个自己的BufferedReader
这种设计模式也被称之为装饰设计模式,
自定义一个类把已有的对象传进来,
然后针对已有的功能进行强化。
*/
import java.io.*; class MyBufferedReader { private FileReader fr=null; MyBufferedReader(FileReader fr) { this.fr=fr; } StringBuffer sb=new StringBuffer(); public String readLine()throws IOException { char ch=' '; int i=0; while((i=fr.read())!=-1) { if(i=='\r') continue; if(i=='\n') return sb.toString(); ch=(char)i; sb.append(ch); } if(sb!=null) return sb.toString(); return null; /* sb.toString()返回的是容器内部的字符串, 写返回值的时候千万不要直接写return sb sb是StringBuffer型的容器! */ } public void close()throws IOException { fr.close(); } public static void soc(Object obj) { System.out.println(obj); } } class Ioliou10 { public static void main(String[] args) { MyBufferedReader bfr =null ; FileReader fr=null; try { fr=new FileReader("f:\\yuyuyu.txt"); bfr=new MyBufferedReader(fr); String s=bfr.readLine(); soc(s); } catch(IOException e) { throw new RuntimeException("操作异常"); } finally { try { if(bfr!=null) bfr.close(); } catch (IOException e) { throw new RuntimeException("bfr.close();出问题了"); } } } public static void soc(Object obj) { System.out.println(obj); } }
——————分割线————
/*
装饰类的介绍:(装饰设计模式)
通常自定义一个类,传进已有的对象,然后增加已有的功能。
装饰类和被装饰类都有着相同的功能,只不过前者功能更强。
所以,一般装饰类和被装饰类在同一个体系中,
而且装饰类记得要覆盖父类的抽象方法,
注意是否要抛出异常。
*/
import java.io.*; class MyBufferedReader extends Reader { private FileReader fr=null; MyBufferedReader(FileReader fr) { this.fr=fr; } StringBuffer sb=new StringBuffer(); public String readLine()throws IOException { char ch=' '; int i=0; while((i=fr.read())!=-1) { if(i=='\r') continue; if(i=='\n') return sb.toString(); ch=(char)i; sb.append(ch); } if(sb!=null) return sb.toString(); return null; } public void close()throws IOException { fr.close(); } public static void soc(Object obj) { System.out.println(obj); } //下面记得要覆盖Reader类中的抽象方法 public int read(char[] cbuf,int off,int len)throws IOException { return fr.read(cbuf,off,len); } } class Ioliou11 { public static void main(String[] args) { MyBufferedReader bfr =null ; FileReader fr=null; try { fr=new FileReader("f:\\yuyuyu.txt"); bfr=new MyBufferedReader(fr); String s=bfr.readLine(); soc(s); } catch(IOException e) { throw new RuntimeException("操作异常"); } finally { try { if(bfr!=null) bfr.close(); } catch (IOException e) { throw new RuntimeException("bfr.close();出问题了"); } } } public static void soc(Object obj) { System.out.println(obj); } }
——————分割线——————
/*
LineNumberReader类的应用:
该类是BufferedReader类的子类
*/
import java.io.*; class Ioliou12 { public static void main(String[] args) { FileReader fr=null; LineNumberReader lnr=null; try { fr=new FileReader("Ioliou12.java"); //建立读取流对象 lnr= new LineNumberReader(fr); String s=" "; lnr.setLineNumber(123); //设置行号从123的后一行开始 while((s=lnr.readLine())!=null) { soc(lnr.getLineNumber()+":"+s); //getLineNumber方法用来获取行号 } } catch(IOException e) { throw new RuntimeException("读取操作出问题"); } finally { try { if(inr!=null) lnr.close(); } catch(IOException e2) { throw new RuntimeException("lnr.close();出问题了"); } } } public static void soc(Object obj) { System.out.println(obj); } }
编译运行结果如图1所示:
图1
版权声明:本文为博主原创文章,未经博主允许不得转载。
黑马程序员——21,字符流FileReader,FileWriter,BufferedWriter,BufferedReader,装饰设计模式,LineNumberReader
原文地址:http://blog.csdn.net/dangaodeaiyi/article/details/47374211