在目录中迭代大量文件

时间:2015-11-06 15:59:28

标签: java file nio

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

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

try {
    for (final File tFile : tFiles) {
        //Process files one by one
    }
}

3 个答案:

答案 0 :(得分:6)

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

FileVisitor界面的文档是here

这允许您在不创建大量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;
         }
     }
 });

答案 1 :(得分:2)

Java 8延迟加载流版本:

Files.list(new File("path to directory").toPath()).forEach(path -> {
    File file = path.toFile();
    //process your file
});

答案 2 :(得分:1)

如果您想避免使用JDK FileVisitor附带的过多样板文件,可以使用GuavaFiles.fileTreeTraverser()为您提供TreeTraverser<File>,您可以使用该{{3}}来遍历文件夹(甚至子文件夹)中的文件:

for (File f : Files.fileTreeTraverser()
                    .preOrderTraversal(new File("/parent/folder"))) {
    // do something with each file
}