当列表文件在目录中时OutOfMemory

Jam*_*mes 11 java file out-of-memory

当我列出包含300,000个带有Java文件的目录的文件时,会发生内存不足.

String[] fileNames = file.list();
Run Code Online (Sandbox Code Playgroud)

我想要的是一种方法,可以逐步列出目录的所有文件,无论该特定目录中有多少文件,并且没有默认64M堆限制的"内存不足"问题.

我有谷歌一段时间,并没有在纯Java中找到这样的方式.
请帮我!!

注意,JNI是一种可能的解决方案,但我讨厌JNI.

dan*_*ben 5

我知道你说"使用默认的64M堆限制",但让我们看一下事实 - 你想使用Java提供的机制在内存中保存(可能)大量项目.所以,除非你有一些可怕的理由,否则我会说增加堆是可行的.

以下是JavaRanch上相同讨论的链接:http: //www.coderanch.com/t/381939/Java-General/java/iterate-over-files-directory

编辑,回应评论:我说他想在内存中保存大量项目的原因是因为这是Java提供的唯一机制,用于列出目录而不使用本机接口或特定于平台的机制(并且OP表示他想要"纯Java").

  • 您无法使用核心Java API. (2认同)

Mir*_*rko 5

您唯一可能的解决方案是 Java7,然后您应该使用迭代器。

final Path p = FileSystems.getDefault().getPath("Yourpath");
Files.walk(p).forEach(filePath -> {
        if (Files.isRegularFile(filePath)) {
            //Do something with filePath
        }
});
Run Code Online (Sandbox Code Playgroud)

  • 在 http://stackoverflow.com/questions/3139073/how-to-list-a-2-million-files-directory-in-java-without-have-a-out-of-memory-e/14241968#14241968我已经发布了一个简单的示例,说明如何使用 Java 7 完成此操作 (2认同)