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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xiaoHei 中级黑马   /  2013-4-24 21:19  /  1664 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 xiaoHei 于 2013-5-6 21:12 编辑

大家好我想请问一下:
BufferedInputStream类中的read()一次,
是不是java调用系统的方法去硬盘中读取8192次,每次读取一个字节?
然后,将这8192个字节放到bufferedInputStream类的缓冲区中?

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 会哭的孩子有奶吃!

查看全部评分

3 个回复

倒序浏览
是的,BufferedInputStream类,每次读一次文件,会读出8192个字节数据,存入缓冲区,然后从这个缓冲区将数据逐字节读出,直到将缓冲区中数据读完,然后再次去读文件,
回复 使用道具 举报
本帖最后由 breeze 于 2013-4-24 22:53 编辑

BufferedInputStream类中的read()方法是第一次调用接收8192个字节的数据存到方法内的缓冲数组, 每次循环调用read()方法是返回缓冲数组中的一个, 等到8192个全部读完以后, 再接收8192个字节的数据到缓冲数组, 应该是从硬盘中一次读取8192个字节的数据到内存中, 然后逐个返回, 相对FileInputStream的read()方法减少了硬盘读取次数
BufferedInputStream类中重写了read() 中调用了InputStream中的read(new byte[8192]);

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 还好

查看全部评分

回复 使用道具 举报
//是的,read()读取一个字节时, 其实已经读取8192个字节到缓冲区了

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Demo2 {
        public static void main(String[] args) throws Exception {
                BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));                        //创建缓冲输入流对象,并与文件输入流相关联
                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.txt"));                        //创建缓冲输出流对象,并与文件输出流相关联
                int b;
                while((b = bis.read()) == -1) {                                                                                // read()读取一个字节时, 其实已经读取8192个字节到缓冲区了
                        bos.write(b);                                                                                                // write()写出一个字节时, 没有直接写到文件, 写到缓冲区里了
                        bis.close();                                                                                                        //关闭流
                        bos.close();
                }
        }

}

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马