【发布时间】:2012-04-11 15:59:12
【问题描述】:
我正在寻找一种有效的方法来迭代一个或多个目录中的数千个文件。
迭代目录中文件的唯一方法似乎是File.list*() 函数。这些函数有效地加载某种集合中的整个文件列表,然后让用户对其进行迭代。就时间/内存消耗而言,这似乎是不切实际的。我尝试查看 commons-io 和其他类似工具。但他们最终都在里面的某个地方打电话给File.list*()。 JDK7 的walkFileTree() 接近了,但我无法控制何时选择下一个元素。
我在一个目录中有超过 150,000 个文件,经过多次 -Xms/-Xmm 试用后,我摆脱了内存溢出问题。但是填充数组所需的时间没有改变。
我希望制作某种 Iterable 类,它使用类似 opendir()/closedir() 的函数来根据需要延迟加载文件名。有没有办法做到这一点?
更新:
Java 7 NIO.2 支持通过java.nio.file.DirectoryStream 进行文件迭代。这是一个Iterable 类。至于JDK6及以下,唯一的选择是File.list*()方法。
【问题讨论】:
-
我不知道是否存在标准解决方案。我想没有其他方法可以做到这一点,但你自己在 C 中实现它并通过 JNI 访问它......
-
这个问题的答案可能会有所帮助 - stackoverflow.com/questions/1034977/…
-
我怀疑这里真正的问题是您有一个包含 150K 文件的目录。我当然不想以这种方式对文件系统进行压力测试。你能不能不使用子目录,也许按文件名中的前两个字符对文件进行分组?
-
@DilumRanatunga:多年的经验告诉我,修复代码比要求用户改变工作方式更具成本效益:)
-
文件名之间是否有共同的模式?
标签: java