【问题标题】:Java, why is BufferedInputStream used in this code? [duplicate]Java,为什么在这段代码中使用了 BufferedInputStream? [复制]
【发布时间】:2021-03-17 19:52:29
【问题描述】:

我试图了解 BufferedInputStream 在这段代码中的使用。 我们这里是从inputStream写到outputStream,那么BufferedInputStream有什么意义呢?它缓冲什么,如果读取和写入的过程是逐字节发生的。

  public static void executor(InputStream inputStream, OutputStream outputStream) throws Exception {
        BufferedInputStream bis = new BufferedInputStream(inputStream);
        while (bis.available() > 0) {
            int data = bis.read();
            outputStream.write(data);
        }
    }

感谢您的帮助!

【问题讨论】:

  • TL;DR 通过读入更大的数据块,效率更高......底层元素以 8192(默认大小)字节的块进行交互,即使副本在一个时间(就像问题一样)。
  • 因为它一次读取一个字节,如果没有缓冲区,这将非常低效。注意这是available()的典型误用:请勿复制。它应该一直读取到流结束(read() 返回 -1)或达到某个定义的长度或内容。因为它一次复制一个字节,它也应该使用BufferedOutputStream,并在完成后刷新它。更好的是,它应该使用read(byte[])write(byte[],int,int) 以及一个相当大的缓冲区,比如8k。在只是复制操作的时候调用方法executor()也是不好的做法。

标签: java


【解决方案1】:

BufferedInputStream 用于性能优化。 BufferedInputStream 环绕另一个InputStream,如 FileInputStream 并缓冲数据。 BufferedInputStream 所做的是它收集多个字节块,以便您可以一次读取更大的数据块以提高性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 2013-09-13
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 2019-11-28
    相关资源
    最近更新 更多