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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

2b青年。

注册黑马

  • 黑马币:0

  • 帖子:7

  • 精华:0

© 2b青年。 注册黑马   /  2012-8-5 21:15  /  1143 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

原帖:【求助】拷贝有了这个,要BufferedInputStream何用?
http://bbs.itheima.com/forum.php ... 5&fromuid=33964

FileInputStram里面实现了InputStream的read();这个read()定义为native的 ,具体与操作系统硬盘的复制api有关,实现一次硬盘io读一个字节。(这个java管不了),另外重写了read(byte[] b, int off, int len)方法,而这个重写的方法里面调用的是FileInputStream独有的 private native int readBytes(byte b[], int off, int len) 方法,这个方法也是本地的方法。与硬盘io的直接操作有关,应该用c写的,这个和那个read()有根本的区别,就是一次io读b个字节!BufferedInputStream里面继承了FilterInputStream里面的InputStream成员in,就在你构造这个BufferedInputStream对象的时候FileInputStram传进去了,BufferedInputStream的read()调用的自己的fill(),而fill()调用的FilterInputStream的read(byte b[], int off, int len),继而调用传进去的FileInputStram的read(byte b[], int off, int len),也就调用了native int readBytes(byte b[], int off, int len) 方法。 从而实现了缓存。
你也可以看看BufferedInputStream里面的read(byte b[], int off, int len),方法,都是调用的一样的native方法,具体二者为什么会有时差,和缓存大小有关!就是和readByte里传的b的大小有关!仅此而已。什么方法怎么写都会回归到最原始和windows操作系统打交道的微软上,这个c++,我放弃的真不对。

3 个回复

倒序浏览
请改下你的论坛名字!
回复 使用道具 举报
同学,不改名字是不能加分的!改名通道!http://bbs.itheima.com/thread-19719-1-1.html
回复 使用道具 举报
我不是学员 偶尔看到了11期的问题。心里想了想 写下来的

修改copy2代码: 加入和1一样的数组:
  1. try
  2. {
  3. fis =new FileInputStream("浮夸原2.mp3");
  4. fos =new FileOutputStream("浮夸2.mp3");
  5. bufis = new BufferedInputStream(fis);
  6. bufos =new BufferedOutputStream(fos);
  7. int num;
  8. int cpymax = 1024*4;
  9. byte[] byt = new byte[cpymax];
  10. while((num=bufis.read(byt)) != -1)
  11. {
  12. bufos.write(byt,0,num);
  13. }
  14. }
  15. catch (IOException ioe){}
复制代码
运行图:
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马