在目录中迭代大量文件

met*_*eor 5 java nio file

我有一个包含100,000个文件的目录,我需要迭代它们以读取值.现在我listFiles()用来加载数组中的所有文件,然后逐个迭代.但是有没有一种内存有效的方法可以在不加载数组的情况下执行此操作?

File[] tFiles = new File(Dir).listFiles();

try {
    for (final File tFile : tFiles) {
        //Process files one by one
    }
}
Run Code Online (Sandbox Code Playgroud)

Men*_*ena 7

从Java 7开始,您可以使用文件访问者模式以递归方式访问目录的内容.

FileVisitor界面的文档在这里.

这允许您在不创建大量File对象的情况下迭代文件.

打印文件名的简单示例:

Path start = Paths.get(new URI("file:///my/folder/"));

Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
     @Override
     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) 
        throws IOException
     {
         System.out.println(file);
         return FileVisitResult.CONTINUE;
     }
     @Override
     public FileVisitResult postVisitDirectory(Path dir, IOException e)
        throws IOException
     {
         if (e == null) {
             System.out.println(dir);
             return FileVisitResult.CONTINUE;
         } 
         else {
             // directory iteration failed
             throw e;
         }
     }
 });
Run Code Online (Sandbox Code Playgroud)