我需要在 Java 中遍历包含大约 2000 万个文件的目录层次结构。目前我正在使用 FileUtils.iterateFiles
来自 Apache Commons-IO。这似乎是通过将整个列表加载到内存中来实现的,这很慢(延迟应用程序启动时间)并且占用巨大内存(大约 8GB)。我以前使用我自己的递归文件迭代器,它有同样的问题。
我一次只需要处理一个文件(或者,沿着轨道,从列表的前面并行地处理一小部分),所以似乎没有必要浪费所有这些时间和内存来加载一个完整的列表内存。
Java 的 Iterator
类允许使用我需要的那种最小内存占用的迭代器,但是由于 java.io.File
类的 native 功能只急切地提供-初始化数组,似乎很难利用这些。
有没有人对我如何遍历文件层次结构而不预先将其全部加载到内存中有任何建议?
感谢this answer我现在知道新的 Java 7 文件 API,我认为它可以解决我的问题,但 Java 7 在这个阶段并不是我的真正选择。
最佳答案
由于 Java 7 NIO 不是一个选项,您可以执行“dir/B/A-D”(对于 Windows)并从输出中读取文件名。如果需要,您可以将输出重定向到一个临时文件并从那里读取文件名。
关于java - 以最少的内存使用遍历 Java 中的许多文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13795491/