黑马程序员_考核技术日志2_IO篇之字符流的处理进程及字符流的缓冲区

发布时间:2016-12-10 12:59:00 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"黑马程序员_考核技术日志2_IO篇之字符流的处理进程及字符流的缓冲区",主要涉及到黑马程序员_考核技术日志2_IO篇之字符流的处理进程及字符流的缓冲区方面的内容,对于黑马程序员_考核技术日志2_IO篇之字符流的处理进程及字符流的缓冲区感兴趣的同学可以参考一下。

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net 1.用数组方式复制文件的图解过程:如下图所示: 在上图中,首先FileReader由给定的路径去寻找到指定的源文件,并打开流,用read方法,把读取的数据存放到一个中间容器中,也就是一个字符串数组中,然后,用FileWriter由给定的路径去创建所要复制的文件路径,然后,用write方法,去把已经读取到字符数组中的数据写放到指定的写文件中。 2.字符流的缓冲区 1)缓冲区的出现提高了对数据的读写效率。 2)对应的类: BufferedWriter    BufferedReader 3)缓冲区要结合流才可以使用。 4)在流的基础上对流的功能进行了增强。 3.用字符缓冲流向文件中写入一些数据的简单例子: //创建一个文件输入流, Writer wr = new FileWriter("f:/aa.txt"); //下面如果 要使用字符流的缓冲区,首先要创建得到字符流的缓冲区对象: //字符流的缓冲区对象中包装了Writer对象。 BufferedWriter bw = new BufferedWriter(wr); //下面是用字符流对象的方法去向文件中写入内容 。 //和上面例子中的一样。 bw.write("My name is Myongyun !"); //下面是流的关闭。 bw.close(); //这里只要关闭最里面一层流关闭即可,相应的打开的流就都关闭了。 可以用这行代表换行的符号   String line = System.getProperty("line.separtor"); 如果写入数据是一个循环时,最好写入一次就把缓冲区刷一次。 4.下面是把文件中的数据用字符缓冲流的方式给读取出来 : //创建一个文件读取流,把要读取的文件读取到内在当中 Reader r = new FileReader("f:/aa.txt"); //创建文件读取字符缓冲区。 BufferedReader br = new BufferedReader(r); String str = null; while((str = br.readLine()) != null) System.out.println(str); //下面是流的关闭。 br.close(); 其中, buffer.read()  ,  这个方法是从缓冲区中取出的字符数据。所以覆盖了父类中的read方法。 到了这步以后就可以操作从缓冲区中读取到的字符了,根据文本行的特点,可以按照行读取,所以进行了下一步的动作就有了一个新的方法:readLine()。 这时候这个临时的容器中存储的就是一行的数据了,不包含换行符,也就是说读取到换行符的时候就不过往临时容器中读了。 5.使用缓冲区进行文件的复制: Reader r = new FileReader("f:/aa.txt"); BufferedReader br = new BufferedReader(r); Writer w = new FileWriter("e:/aa.txt"); BufferedWriter bw = new BufferedWriter(w); //上面都和以前一样,把它们包装成字符缓冲流对象 String line = null; while((line = br.readLine()) != null) bw.write(line); //其中上面看起来和以前没有什么区别,但是,这是从缓冲区中读取的,写的时候也是写入到了缓冲区中的。 br.close(); bw.close(); 6.装饰模式 对一组对象的功能进行增强时,可以使用该模式进行问题的解决。 下面是简单的代码实现 : //要对Person这个类进行增强。这个类中只有一个方法去输出一句话。 //但是我想在这句话输出前或者输出后做一些事情 。 class Person { public void say() { System.out.println("say : Hello !"); } } //这个就是对Person进行装饰的类, class RePerson { //如果想对say方法进行增加,首先我们要持有一个Person对象的引用。 private Person p; public RePerson(Person p) { this.p = p; } public void say() { //这里对say方法里面,进行我们自己定义的一些动作。 System.out.println("Say : Hello , "); System.out.println("Myongyun !"); } } public static void main(String[] args) throws Exception      { //首先生成 一个Person类。 Person p = new Person(); //对这个Person类进行装饰,包装。使用一些我们自定义的动作。 RePerson rp = new RePerson(p); rp.say();     } 不过我们用继承的方式 也可以实现如同上面一样的功能: class RePerson extends Person { @Override public void say() { super.say(); System.out.println("say : GoodBye !"); } } 装饰和继承都能实现一样的特点:进行功能的扩展增强。 他们之间有什么区别呢? 首先有一个继承体系: Writer: 1)TextWriter:用于操作文本对象。 2)MediaWriter:用于操作媒体对象。 如果我们想要对操作的动作进行效率进行提高。 按照我们面向对象的思想,可以通过继承来对具体的对象进行功能的扩展。 下面是对每个对象加入缓冲技术,以提高其效率。 Writer: 1)TextWriter:用于操作文本对象。 1>BufferedTextWriter:加入了缓冲技术的操作文本的对象。 2)MediaWriter:用于操作媒体对象。 1>BufferedMediaWriter:加入了缓冲技术的用于操作媒体的对象。 到了这里基本增强完了。但是这样做好像并不理想。 如果这个体系进行了功能的扩展,又多了许多 流对象,那么这个流要提高其效率,是不是也要产生子类呢? 答案是是的,这时就会发现只为提高功能进行的继承,导致继承体系越来越臃肿。不够灵活 。 那么我们现在重新思考这个问题: 既然都是加入的都是同一种技术--缓冲技术。 前一种是让缓冲和具体的流对象,和具体的对象相结合 。 可不可以将缓冲进行单独的封装?哪个对象需要缓冲就将哪个对象和缓冲关联。 如: 因为BufferWriter其实质是不是还是写功能,所以要继承Writer就可以了。 class BufferWriter extends Writer{ Buffer(Writer w) { } } 也就是说现在这个体系变成了这个样子的了: Writer: 1)TextWriter:用于操作文本对象。 2)MediaWriter:用于操作媒体对象。 3)BufferWriter:用于提高效率的。 最后得出,装饰要比继承灵活。这就是装饰设计模式。 特点:装饰类和被装饰类都必须所属于同一个接口或者父类。

上一篇:WindowsPhone8 ListBox 实现手风琴折叠菜单效果
下一篇:UItableview背景透明

相关文章

相关评论