我读到这些用于减少磁盘/网络调用开销,这在写入操作的情况下似乎很好。但是做缓冲读取有什么好处?
答案 0 :(得分:2)
从输入流中读取有时可能是一个很长的操作。
如果流生成器将信息保存在更大的块上,则读取单个字节不是一个很好的选择。例如,文件以数千字节的形式保存在磁盘上。如果你不使用缓冲区,你可以从磁盘重新加载相同块的很多次来读取组成它的字节。而是使用缓冲区,读取操作将块(或部分块)保存在内存中,减少了磁盘上的I / O操作。
因为从内存中读取比从磁盘读取更快,所以可以使相同的操作获得大量时间。
写作注意事项:您唯一需要注意的是要记住,对于写入操作,如果您不在末尾刷新缓冲区,则不会将数据写入文件。操作。
答案 1 :(得分:2)
如果您逐个字节地读取文件,则每次都会进行系统调用,这是一项昂贵的操作。使用缓冲读取,您可以为每个缓冲区进行一次系统调用。此代码在130毫秒内从我的PC上的文件中读取100K:
InputStream is = new FileInputStream("d:/1");
long start = System.currentTimeMillis();
for(int i = 0; i < 100000; i++) {
is.read();
}
System.out.println((System.currentTimeMillis() - start));
如果我用
更改第一行InputStream is = new BufferedInputStream(new FileInputStream("d:/1"));
它在12毫秒内读取100K。
答案 2 :(得分:1)
当您从InputStream读取字节时,在某种程度上需要进行系统调用以从磁盘读取物理文件。现在,系统调用成本很高 - 他们需要将参数从用户空间传递到内核空间,然后在执行之前切换到内核模式。调用完成后,结果应再次从内核移回用户空间。
通过使用BufferedInputStream
,可以减少read
系统调用的数量。例如,如果在非缓冲模式下读取1000个字节 - 则需要进行1000次系统调用。在缓冲模式下,BufferedInputStream
使用单个系统调用读取数据块(通常为1024个字节)。输入流上的每个read
调用都会从自己的缓冲区中提供数据。