io中流分输入,输出,常见的输入流对象有keyboard,file等; 输出流对象有display,file等比如我现在构建一个如下的文件输入流
     FileReader in = new FileReader("IOStreamDemo.java")
然后又把它打包成缓冲留
     BufferedReader bin = new BufferedReader(in)我的问题是,in和bin到底有什么区别,为什么要用缓冲流,到底有什么好处,它的底层运作机制是什么呢不解中?

解决方案 »

  1.   

    Buffer就是一个缓冲,我认为目的就是一个:为了提高速度!
    当然在BufferedReader中有个readLine方法比较好用(我喜欢用)
    至少比其他的read方法容易用!
      

  2.   

    朋友这个其实没什么的  in FileReader的对象 而binBufferedReader的对象我想你一定想问为什么要多套一个BufferedReader吧
    其实就是为了readLine();这个方法啊,这个方法可以一行一行的读而FileReader没有这个方法,用这个方法效率就更高,我只能这么给你解释不知道朋友你明白没有,多看看API帮助手册多写写代码慢慢体会吧!!我以前也是搞不懂这个
      

  3.   

    FileReader这个是节点流
    BufferReader 是处理流
    FileReader就像一个自流水管道,接到水源
    BufferReader 就像套在自流水管道的水管,对水的流向,流速,存储量,净化,等等
    这是个比喻,呵呵
      

  4.   

    看看jdk说明文档:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。 通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。例如,  BufferedReader in
       = new BufferedReader(new FileReader("foo.in"));
     将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。 
    通过用合适的 BufferedReader 替代每个 DataInputStream,可以对将 DataInputStream 用于文字输入的程序进行本地化。 
      

  5.   

    谢谢朋友们,
    我的疑惑(个人理解,不知对否):
    【输入缓冲流】
    对于如下代码行1(不带缓冲流), new FileReader("IOStreamDemo.java") 是否意味着把一个字节流管道接到“IOStreamDemo.java”上,但并没有格式化为字节流,文件还是文件,还在硬盘上,只有通过read()等方式读取时候,才开始格式化,并且每次只格式化读取的一个字节(相对read()方法而言),就cpu处理速度和硬盘读取速度而言,前者远远高于后者,每次cpu都要等很长的时间,所以效率低下对于下面代码行2(带有缓冲流), BufferedReader bin = new BufferedReader(in) ,其在构建缓冲流的同时,即读取一定数目的字符流到缓冲区(内存中),当我们再读取操作时(缓冲流),实际上是从内存中读取的, 因内存速度远大于硬盘速度(10倍以上),所以就提高了效率,(相当于减少硬盘读取次数); 只有当缓冲区读完时,才开始读取硬盘
    -----------
    【输出缓冲流】
    cpu先写一定数量的字节/字符到输出缓冲区中,写满后,cpu就可干别的了,然后由缓冲区向硬盘进行写入动作(io操作,通过通道方式等?)
    以上的理解问题再哪,请高人指点??
    --------附问题描述-----------
    比如我现在构建一个如下的文件输入流 
       1.  FileReader in = new FileReader("IOStreamDemo.java") 
    然后又把它打包成缓冲留 
       2.  BufferedReader bin = new BufferedReader(in)     in和bin到底有什么区别,为什么要用缓冲流,到底有什么好处,它的底层运作机制是什么呢 
    -----------------
      

  6.   

    装饰模式,bin 和 in有不同的功能,看你的需要了,FileReader有基本的读取文件的能力,BufferedReader有 缓冲的读取文件的能力,对于大文件来说,用BufferedReader来套一层读取会效率高点
      

  7.   

    简单来说,你可以这样理解
    一般流,是直接从源读取数据,并且讲读取到的字节数据直接反馈给程序
    类似这样 -> [数据源] -> [程序]
    就是说,你必须每次处理一个字节数据缓冲流,中间加了一层缓冲机制,源数据首先被送到内存中,达到一定量以后,传送给程序处理
    类似这样 -> [数据源] -> [内存] -> [程序]
      

  8.   

    楼上的朋友说得很好你说的:
    缓冲流,中间加了一层缓冲机制,源数据首先被送到内存中,达到一定量以后,传送给程序处理 
    类似这样 -> [数据源] -> [内存] -> [程序] 是针对输出缓冲吧?
      

  9.   

    BufferedReader中的readLine()读取一行,就没有限制吗?读取诸如照片音频之类基于字节文件能正常读取吗?问题还很多.感觉API上说的太简单了,
    得听听多方意见.
      

  10.   

    发现很多人对readline的理解不对
    不是readline一次就读一次文件的,简单点说
    首先,读取文件一定量数据(比如1000字节)到内存中
    然后,在这内存里读取数据直到发现第一个换行符(\n)为止,将这部分数据写到一个String上,并返回出来
    这是一次readline动作BufferReader是处理字符类型文件的,也就是文本文件
    一般处理其他二进制类文件,都是需要自己处理缓冲问题
    类似这样的代码InputStream in = 一个输入源
    byte buf[] = new byte[1024];
    int readSize;while((readSize = in.read(buf)) != -1) {
      处理buf缓冲数组
    }
      

  11.   

    之所以用缓冲,是为了减少读写硬盘的次数,如果都是每个字节的读写,效率非常低,我们可以设置一定的字节数组大小,将数据放入其中,再一次性的进行读写,那么效率就会大大的提高,比如BufferedReader的readLine就是典型的例子,他不是一个字节一个字节的读,而是读一整行,效率高多了! 任何带有Buffer这样的,都是缓冲,比如ByteBuffer,原理都是一样的,对字节数组进行操作,而不是对字节进行操作!