【发布时间】:2015-10-17 15:34:15
【问题描述】:
所以我必须使用 Java 文件树系统,因为 .listfiles 文件由于某种原因在通过远程网络时速度非常慢。然而,所有 Java 文件树系统示例都列出了子目录中的所有文件,从而严重降低了程序的速度。我怎样才能使它只搜索目录并只返回该目录中的文件夹和文件的名称,而不是子目录。
示例代码:
package javaapplication6;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
/** Recursive listing with SimpleFileVisitor in JDK 7. */
public final class JavaApplication6 {
public static void main(String... aArgs) throws IOException{
String ROOT = "\\\\directory";
FileVisitor<Path> fileProcessor = new ProcessFile();
Files.walkFileTree(Paths.get(ROOT), fileProcessor);
}
private static final class ProcessFile extends SimpleFileVisitor<Path> {
@Override public FileVisitResult visitFile(
Path aFile, BasicFileAttributes aAttrs
) throws IOException {
System.out.println("Processing file:" + aFile);
return FileVisitResult.CONTINUE;
}
@Override public FileVisitResult preVisitDirectory(
Path aDir, BasicFileAttributes aAttrs
) throws IOException {
System.out.println("Processing directory:" + aDir);
return FileVisitResult.CONTINUE;
}
}
}
任何见解或帮助将不胜感激,谢谢。
【问题讨论】:
-
如果你不想递归遍历文件,为什么要使用
Files.walkFileTree?您可以只使用带有过滤器的DirectoryStream。 -
walkfiletree 不是更快吗?
-
这不是速度问题,而是目的问题:
walkFileTree顾名思义,设计为遍历文件树,这意味着在子目录中递归。如果您只想列出文件夹的内容(没有递归),则应该使用DirectoryStream。此类旨在处理非常非常大的目录。 -
你确定吗?因为这里:bugs.openjdk.java.net/browse/JDK-8008469 建议的解决方案是使用 walkfiletree
-
从您链接到的错误中读取this comment 表明它比这更棘手。性能问题似乎与
Files.isDirectory相关,但如果您只是使用DirectoryStream列出目录条目,则无需调用此方法。我建议您尝试此解决方案,看看您是否遇到任何性能问题。
标签: java filetree filevisitor file-traversal