A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

5黑马币
本帖最后由 @白纸嘿字@ 于 2015-10-7 23:29 编辑

谁能掰开了,揉碎了,解读一下BufferedInputStream和BufferedOutputStream的源代码,为什么要来这一个类?黑马程序员培训营毕向东老师讲到这时,没有具体讲到它怎么就提高效率了
  1. package com.itheima.io.copy;

  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;

  8. public class CopyTextBufTest {

  9.         /**
  10.          * @param args
  11.          * @throws IOException
  12.          */
  13.         public static void main(String[] args) throws IOException {

  14.                 // 以源文件作为参数,建立文件字节输入流对象

  15.                 FileInputStream fis = new FileInputStream(
  16.                                 "I:\\20151002锵锵三人行 作家的钱是那里来的【华夏视讯网首发hxsxw.com】【迅雷+百度云下载】.rmvb");

  17.                 // 建立文件字节输入流中转站对象

  18.                 BufferedInputStream bufis = new BufferedInputStream(fis);

  19.                 // 以目标文件作为参数,建立文件字节输出流对象

  20.                 FileOutputStream fos = new FileOutputStream(
  21.                                 "G:\\20151002锵锵三人行 作家的钱是那里来的.rmvb");

  22.                 // 建立文件字节输出流中转站对象

  23.                 BufferedOutputStream bufos = new BufferedOutputStream(fos);
  24.                 // “读取”“写入”文件第一种方式
  25.                 // 定义存储单个字节的变量

  26.                 // int single_byte=0;

  27.                 // 调用文件字节输入流中转站对象“读取”功能

  28.                 // while((single_byte=bufis.read())!=-1){

  29.                 // 调用文件字节输出流中转站对象“写入”功能

  30.                 // bufos.write(single_byte);
  31.                 // }

  32.                 // “读取”“写入”文件第二种方式
  33.                 // 定义一个字节数组

  34.                 byte[] buf = new byte[1024];

  35.                 // 定义一个记录获取了多少个字节的变量

  36.                 int len = 0;

  37.                 // 调用文件字节输入流中转站对象“读取”功能

  38.                 while ((len = bufis.read(buf)) != -1) {

  39.                         // 调用文件字节输出流中转站对象“写入”功能

  40.                         bufos.write(buf, 0, len);
  41.                 }
  42.         }

  43. }
复制代码


这个是毕老师的代码(思路是这样的,代码不完全一样),看了几遍,唯有一个感受,绕来绕去,有这个必要吗?
老是说着“提高效率”“提高效率”,可是不知道为什么总有一种感觉,就是这和我没关系!也是,我从没有直观地感受到所谓的“提高效率”!


最佳答案

查看完整内容

1. java.io.BufferedReader和java.io.BufferedWriter类各拥有8192字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取,使用BufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。 2. 从标准输入流System.in中直接读 ...

5 个回复

倒序浏览
1. java.io.BufferedReader和java.io.BufferedWriter类各拥有8192字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取,使用BufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。

2. 从标准输入流System.in中直接读取使用者输入时,使用者每输入一个字符,System.in就读取一个字符。为了能一次读取一行使用者的输入,使用了BufferedReader来对使用者输入的字符进行缓冲。readLine()方法会在读取到使用者的换行字符时,再一次将整行字符串传入。

3. System.in是一个位流,为了转换为字符流,可使用InputStreamReader为其进行字符转换,然后再使用BufferedReader为其增加缓冲功能
回复 使用道具 举报
    你好,我来发表下自己的见解。
    首先,这个效率并不是你说的表面上代码的多少,而是虚拟机运行时对系统资源的消耗低,从而达到程序执行效率高。我通俗的打个比方,如果不用,缓冲区,那么程序就是读一个字符就要输出一次(简单来讲,中断下,占用一次cpu)。而我用了缓冲区,那就根据缓冲区大小,但缓冲区满了,才输出。这样明显改善了cpu的效率。而且,缓冲区,还有个在不同速度间,速度匹配的作用。
   以上,希望能对你有所帮助。
回复 使用道具 举报
你可以使用System.currentTimeMillis();试一下2者实际使用的时间,不带缓冲的操作,每读一个字节就要写入一个字节,由于涉及磁盘的IO操作相比内存的操作要慢很多,所以不带缓冲的流效率很低。带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高很多!这就是提高了效率,当你用IO流要读取很多很大的文件的时候,没提高一点效率就显得非常有必要了
回复 使用道具 举报
提高效率的方法就是建立一个字节数组 跟你这里的        byte[] buf = new byte[1024];一样
这样在读写的时候可以一次性写入1024个字节这样就提高了效率,如果不是这样每次只写一个字节很占用了系统资源又没有很好达到很高的效率
回复 使用道具 举报
。。。。。。。。。。。。。。。。。。。。。。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马