黑马程序员技术交流社区

标题: 字符流都带缓冲区?如果是,为什么都带缓冲区? [打印本页]

作者: 谢洋    时间: 2013-3-8 22:03
标题: 字符流都带缓冲区?如果是,为什么都带缓冲区?
字符流都带缓冲区?如果是,那为什么都带缓冲区?
作者: 熊冠银    时间: 2013-3-8 22:05
可以不用缓冲区,使用缓冲区是为了提高效率
作者: Benwolf0818    时间: 2013-3-8 22:07
不是,缓冲区是为了提高读写效率而引入的
作者: 邹学良    时间: 2013-3-8 22:18
本帖最后由 邹学良 于 2013-3-8 22:19 编辑

之所以有字符流缓冲区,是因为把字符流都作为缓冲处理能提高字符流的读写效率,如果没有缓存,例如FileReader对象,每次调用read()方法进行读操作时,都会直接去文件中读取字节,转换成字符并返回,这样频繁的读取文件效率很低。缓冲区实现原理就是将数组进行封装。缓冲的字符流的出现提高了对流的操作效率,缓冲的存在是为了增强流的功能,因此在建立缓冲的字符流对象时,要先有流对象的存在
如例:
  1. import java.io.*;
  2. public class BufferWriterDemo {
  3.     public static void main(String args[])throws Exception{
  4.         //创建一个字符写入流对象
  5.         FileWriter fw=new FileWriter("buf.txt");
  6.          //为了提高字符定稿流效率。加入缓冲技术
  7.         //只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可.
  8.         BufferedWriter bufw=new BufferedWriter(fw);
  9.         bufw.write("abcde");
  10.         bufw.newLine();//跨平台换行符方法
  11.         bufw.flush();
  12.               //关闭缓冲区,就相当于关闭缓冲中的流对象
  13.         bufw.close();
  14.     }
  15. }

  16. //BufferReader使用
  17. //从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
  18. class BufferReaderDemo{
  19.     public static void main(String args[]){
  20.         try{
  21.                 FileReader fr=new FileReader("buf.txt");
  22.                 //为了提高效率加入缓冲技术,将字符读取流对象作为参数 ,会北给缓冲对象的构造函数
  23.             BufferedReader bufr=new BufferedReader(fr);
  24.             String line=null;
  25.             while((line=bufr.readLine())!=null){
  26.                 System.out.println(line);
  27.             }
  28.         }catch(Exception e){
  29.            
  30.         }
  31.     }
  32. }
复制代码

作者: 聂斌    时间: 2013-3-9 01:07

同学:

               FileWriter fw = new FileWriter("demo.txt");  
                 
                fw.write("abcde");

                //刷新流对象中的缓冲区中的数据。把流里面的数据放到文件里去用flush(刷新)()方法,,流对象进内存以后,,他内部有缓冲区,临时存放数据,你想把这些数据放到文件中去只要flush,他就会清空,,叫做将缓冲区里面临时存放的数据弄到文件里去
                //将缓冲区里的数据刷到目的地中。
                   fw.flush();   文件里有数据了  
                fw.close();  

说明流里面是有缓冲区的,,,他把你写入到流中的数据先存储起来,,,,当你调用falush或者close方法时他会一次性的把流当中缓冲区里的数据刷新到文件里,,,,

流对象里有个缓冲区,那个缓冲区是个字符数组

那为什么需要缓冲区呢???

答:
  字符流他其实一样走的是字节,但是他需要把字节临时存起来,,一个中文有2个字节我从硬盘里读一个字节以后还不能立刻操作,因为半个中文操作不了,所以我读完一个字节以后我又读了一个字节,,把这2个字节临时存起来以后就去查ascll表了,,查完表就找到一个对应字符,,这就有了临时存储,,字符流缓冲区里面有个数组就是用来临时存储数据的
作者: 聂斌    时间: 2013-3-9 09:41
很多同学都会把BufferReader当成是字符流的缓冲区,,其实BufferReade他是个字符缓冲流,他只是个流,,并不是缓冲区,,,BufferReade他在fileeread的基础上加上了缓冲技术,,,就是BufferReade的读取方式不一样,,,他可以每次读一行,,,
作者: 江华    时间: 2013-3-9 09:53
本帖最后由 江华 于 2013-3-9 10:24 编辑

这个问题,视频中有讲解,你可以再次看下。
我说下晚点理解
就像我们打字一样,
       我们看到的文章是一个字母字母的出现的,我们也一个字母一个字母的输入,输入过程中,它显示的的频率有可能快,有可能慢,这个时间,我们要是一个个跟着输入的话,那就必须等待,这样无形中,会展现一个效果,我们打字速度很慢!
      其实,真的的是我们打字速度很慢么?
      分析上述事例,会发现:
      读取信息 -  输出信息 -等待读入信息

  步骤1、读取硬盘的操作不可避免,这个操作少了,就没有数据来源了
步骤2、写入硬盘,这个可以优化的,多次去写,没有一次多写速度快
(因为硬盘要多次根据这个写入操作去做:寻址,写入,而硬盘的机械盘,寻址速度没有内存中的寻址速度快)

所以,减少硬盘的寻址速度,就可以加快这个操作的完成速度,而内存就是解决办法,于是缓存区就出现了
(如果,硬盘的读写速度等于或超过内存,那缓冲区就没有存在价值,当然这个也不可能)











作者: 江华    时间: 2013-3-9 10:30
接着说,因为java是面相对象的开发语言,按照对象的思想

读取是一个对象,
缓冲区的这个不是“读取”这个对象的属性和方法,它只是一个对对象的操作类
因为它是操作对象,所以这个类的出现,必须有要操作的对象。
因此,缓冲区和字符流(字节流)同时出现,而字符流(字节流)的出现并是必须出现缓冲区。



作者: 谢洋    时间: 2013-3-9 11:20
好像还没看到满意的答案,好多人都答非所问,
我的意思是:字符流包括Reader、Writer及其其子类,他们的对象本身都会带有一个缓冲区?
如果是,好像Reader没有flush方法,那又为什么?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2