黑马程序员技术交流社区

标题: 关于BufferOutputStream中缓存的,读取问题 [打印本页]

作者: xiaoHei    时间: 2013-4-24 21:19
标题: 关于BufferOutputStream中缓存的,读取问题
本帖最后由 xiaoHei 于 2013-5-6 21:12 编辑

大家好我想请问一下:
BufferedInputStream类中的read()一次,
是不是java调用系统的方法去硬盘中读取8192次,每次读取一个字节?
然后,将这8192个字节放到bufferedInputStream类的缓冲区中?
作者: wangyougu010    时间: 2013-4-24 21:31
是的,BufferedInputStream类,每次读一次文件,会读出8192个字节数据,存入缓冲区,然后从这个缓冲区将数据逐字节读出,直到将缓冲区中数据读完,然后再次去读文件,
作者: breeze    时间: 2013-4-24 22:29
本帖最后由 breeze 于 2013-4-24 22:53 编辑

BufferedInputStream类中的read()方法是第一次调用接收8192个字节的数据存到方法内的缓冲数组, 每次循环调用read()方法是返回缓冲数组中的一个, 等到8192个全部读完以后, 再接收8192个字节的数据到缓冲数组, 应该是从硬盘中一次读取8192个字节的数据到内存中, 然后逐个返回, 相对FileInputStream的read()方法减少了硬盘读取次数
BufferedInputStream类中重写了read() 中调用了InputStream中的read(new byte[8192]);
作者: 付鑫鑫    时间: 2013-4-27 16:42
//是的,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();
                }
        }

}





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