java - 以最少的内存使用遍历 Java 中的许多文件

标签 java file file-io iterator iteration

我需要在 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/

相关文章:

java - (非常基础)Java在while循环中设置 boolean 值

python - 使用 Outlook.OpenSharedItem 打开带有空格的文件会出现错误

python - 如何使用 Python 从 24 位和小端字节序的文件中读取整数?

java - 如何使用类加载器作为文件加载资源?

javascript - 在 Google Chrome 中创建的 Blob 文件可以存在多久?

c# - 无法删除 Windows 应用商店应用程序中的文件 - 访问被拒绝。 (HRESULT : 0x80070005 (E_ACCESSDENIED))

java - 如何读取文本文件的某些 block 。 java

java - 在 Google Maps Android API v2 DEBUG 和 RELEASE API Key 之间切换

Java ProcessBuilder().start() 与 NodeJS require ('child_process' ).spawn()

java - 如何单击删除文本可用的特定行?