代码之家  ›  专栏  ›  技术社区  ›  Tomasz Blachowicz

缓冲文件输入流怎么样?

  •  7
  • Tomasz Blachowicz  · 技术社区  · 15 年前

    我有一段代码,它在一个循环中从本地文件系统中读取大量(几十万)相对较小的文件(几KB)。每个文件都有一个 java.io.FileInputStream 创建以读取内容。这个过程很慢,需要很长时间。

    你认为把金融机构包装成 java.io.BufferedInputStream 会有很大的不同吗?

    3 回复  |  直到 15 年前
        1
  •  9
  •   BalusC    15 年前

    如果您还没有使用 byte[] buffer 在读/写循环中具有合适的大小(最新的 BufferedInputStream 使用8kb),然后它将 当然 与众不同。你自己试试吧。别忘了做点什么 OutputStream BufferedOutputStream 也。

    但是如果你已经用 byte[] 而且/或者说,它毕竟没有什么区别,那么您就碰到了硬盘和I/O控制器速度的瓶颈。

        2
  •  3
  •   Michael Borgwardt    15 年前

    我非常怀疑这是否会有什么不同。

    你的基本问题是成百上千的小文件。读这些将使磁盘不停地跳动,并永远消耗下去,不管你怎么做,你将花费99,9%的时间等待硬盘内部的机械运动。

    有两种方法可以解决此问题:

    • 将您的数据保存在一个SSD上-它们的延迟要低得多(比如减少5个数量级)。
    • 将数据重新排列成几个大文件,然后按顺序读取这些文件
        3
  •  3
  •   David Gelhar    15 年前

    这取决于你如何读取数据。如果您以非常低效的方式(例如,逐字节调用read()字节)读取fileinputstream,那么使用bufferedinputstream可以显著提高性能。但是,如果您已经在fileinputstream中使用了一个合理大小的缓冲区,那么切换到bufferedinputstream并不重要。

    因为您谈论的是大量非常小的文件,所以很可能很大程度上延迟是由于目录操作(打开、关闭),而不是从文件中实际读取字节。