何时以及为何使用缓冲输入和输出流?

时间:2015-09-01 07:57:42

标签: java

我读到这些用于减少磁盘/网络调用开销,这在写入操作的情况下似乎很好。但是做缓冲读取有什么好处?

3 个答案:

答案 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调用都会从自己的缓冲区中提供数据。