<1 IO流(BufferedWriter)>
package day19;import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;/** * 缓冲区 出现时为了提高流的操作效率而出现的 * 所以在创建缓冲区之前,必须要先有流对象 * * 该缓冲区中提供了一个跨平台的换行符:newLine() * 注意:像这样的方法,都是只有 缓冲区对象才有的。所以一定要先有缓冲区对象。 * Created by Administrator on 2017/2/8. */public class BufferedWriterDemo { public static void main(String[] args) throws IOException { //创建一个字符写入流对象。 FileWriter fw = new FileWriter("buf.txt"); //为了提高字符写入流效率,加入了缓冲技术. //只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可. BufferedWriter bufw = new BufferedWriter(fw); for(int x = 1; x < 5; x++){ bufw.write("abcd" + x); bufw.newLine(); bufw.flush(); } //记住,只要用到缓冲区,就要记得刷新。 bufw.flush(); //其实关闭缓冲区,就是在关闭缓冲区中的流对象 bufw.close(); }}<02 IO流(BufferedReader)>package day19;import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;/** * 字符读取流缓冲区 * * 一行一行的读,是最方便的 * * 该缓冲区提供了一个一次读一行的方法readLine(),方便于对文本数据的读取。 * 当返回null时,表示读到文件末尾。 * * readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。 * Created by Administrator on 2017/2/8. */public class BufferedReaderDemo { public static void main(String[] args) throws IOException { //创建一个读取流对象和文件相关联 FileReader fr = new FileReader("buf.txt"); //为了提高效率,加入缓冲技术,将字节读取流对象作为参数传递给缓冲对象的构造函数 BufferedReader bufr = new BufferedReader(fr);// String s1 = bufr.readLine(); //一行一行的读// System.out.PRintln(s1); //循环读 String line = null; while((line = bufr.readLine()) != null){ System.out.println(line); } }}<03 IO流(通过缓冲区复制文本文件)>package day19;import com.sun.org.apache.regexp.internal.RE;import java.io.*;/** * 通过缓冲区复制一个.java文件. * Created by Administrator on 2017/2/8. */public class CopyTestByBuf { public static void main(String[] args){ BufferedReader bufr = null; BufferedWriter bufw = null; try { bufr = new BufferedReader(new FileReader("D://code//javacode//src//day19//BufferedWriterDemo.java")); bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt")); String line = null; //中转站(两种流之间的桥梁) while((line = bufr.readLine()) != null){ bufw.write(line); bufw.newLine(); bufw.flush(); } } catch (IOException e) { throw new RuntimeException("读写失败"); }finally { try { if(bufr != null) bufr.close(); } catch (IOException e) { throw new RuntimeException("读取关闭失败"); } try { if(bufw != null) bufw.close(); }catch(IOException e){ throw new RuntimeException("写入关闭失败"); } } }}<04 readLine的原理>readLine()方法的原理:
无论是读一行,还是读取多个字符。其实最终都是从硬盘上一个一个的读取。
所以最终使用的还是read()方法来一个一个的读。
只要遇到回车符/n,就表示前面的数据是一行。于是会把前面的数据一次性的输出。 (而read()是读一个 返回一个)
<05 自定义MyBufferedReader>
<06 装饰设计模式/装饰类>
装饰类的方式:
构造函数的传递,基本功能增强。
package day19;/** * 装饰设计模式: * 当想要对已有的对象进行功能增强时, * 可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。 * 那么自定义的类称为装饰类 * * 装饰类通常会通过构造方法接收被装饰的对象。 * 并基于被装饰的对象的功能,提供更强的功能。 * Created by Administrator on 2017/2/9. */class Person{ public void chifan(){ System.out.println("吃饭"); }}class SuperPerson{ private Person p ; SuperPerson(Person p){ this.p = p; } public void superChifan(){ System.out.println("开胃菜"); p.chifan(); System.out.println("甜点"); System.out.println("来一根"); }}public class PersonDemo { public static void main(String[] args){ Person p = new Person(); p.chifan(); }}<07 装饰和继承的区别>(再听)装饰更灵活。
不要继承太多。
/*MyReader//专门用于读取数据的类。 |--MyTextReader |--MyBufferTextReader |--MyMediaReader |--MyBufferMediaReader |--MyDataReader |--MyBufferDataReaderclass MyBufferReader{ MyBufferReader(MyTextReader text) {} MyBufferReader(MyMediaReader media) {}}上面这个类扩展性很差。找到其参数的共同类型。通过多态的形式。可以提高扩展性。class MyBufferReader extends MyReader{ private MyReader r; MyBufferReader(MyReader r) {}} MyReader//专门用于读取数据的类。 |--MyTextReader |--MyMediaReader |--MyDataReader |--MyBufferReader以前是通过继承将每一个子类都具备缓冲功能。那么继承体系会复杂,并不利于扩展。现在优化思想。单独描述一下缓冲内容。将需要被缓冲的对象。传递进来。也就是,谁需要被缓冲,谁就作为参数传递给缓冲区。这样继承体系就变得很简单。优化了体系结构。装饰模式比继承要灵活。避免了继承体系臃肿。而且降低了类于类之间的关系。装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。所以装饰类和被装饰类通常是都属于一个体系中的。*/class { public static void main(String[] args) { System.out.println("Hello World!"); }}<08 自定义装饰类>要重写Reader中的抽象方法。
<09 LineNumberReader>
它里面有个属性LineNumber,报告对应的get和set方法:getLineNumber()、setLineNumber()
package day19;import java.io.*;/** * Created by Administrator on 2017/2/9. */public class LineNumberReader { public static void main(String[] args) throws IOException { FileReader fr = new FileReader("D://code//javacode//src//day19//PersonDemo.java"); java.io.LineNumberReader lnr = new java.io.LineNumberReader(fr); String line = null; lnr.setLineNumber(100); while((line = lnr.readLine()) != null){ System.out.println(lnr.getLineNumber() + ": " + line); } lnr.close(); }}//练习:模拟一个带行号的缓冲区对象。
新闻热点
疑难解答