【问题标题】:Reading directory using file api : how to handle a directory containing 20000-30000 files?使用文件 api 读取目录:如何处理包含 20000-30000 个文件的目录?
【发布时间】:2012-05-09 12:48:27
【问题描述】:

我正在编写一个读取目录内容的简单java程序 并打印出文件名和最后修改时间。

我预见到的问题是,我正在阅读的保险库非常庞大,并且在某些情况下 单个目录中的文件可以超过 20000 个。 使用文件 api

    `file.listFiles()` 

会反过来创建 20000 个文件对象,我担心这个 可能会减慢进程,也可能会导致内存膨胀。

有没有办法进行批处理,即告诉 java 一次扫描 50 个文件的目录,或者一次至少迭代一个文件,而不是一次将所有对象加载到内存中

【问题讨论】:

    标签: java file-io directory iteration


    【解决方案1】:

    我不会担心内存,我会担心这些文件的磁盘访问时间。

    文件的访问时间可以是 8 毫秒,即使是 SSD,也可以是 100 微秒。创建 File 对象所需的时间可能不到一微秒。

    您说得对,20,000 个 File 对象并非微不足道,但如果这是您的主要问题,那么您做得很好。

    您可以改用list(),这会稍微提高内存效率,并且只在需要时创建文件。

    【讨论】:

    • 但是要访问最后修改的时间戳,我必须使用文件名创建一个文件对象,这只会减慢进程..你不认为
    • 这将产生几微秒的差异,远远小于单个文件 lastModified() 访问。我会以最简单的方式编写代码。
    【解决方案2】:

    您应该通过 java.nio.file.Files.walkFileTree(...) 使用 java.nio.file.FileVisitor。它已在 Java 7 中专门针对此用例引入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 2011-08-26
      • 2014-01-14
      • 1970-01-01
      相关资源
      最近更新 更多