我有这个函数可以递归地打印目录中所有文件的名称。问题是我的代码非常慢,因为每次迭代都必须访问远程网络设备。
我的计划是首先递归加载目录中的所有文件,然后使用正则表达式遍历所有文件以过滤掉所有我不想要的文件。谁有更好的建议?
public static printFnames(String sDir) {
File[] faFiles = new File(sDir).listFiles();
for (File file : faFiles) {
if (file.getName().matches("^(.*?)")) {
System.out.println(file.getAbsolutePath());
}
if (file.isDirectory()) {
printFnames(file.getAbsolutePath());
}
}
}
这只是稍后的测试,我不会使用这样的代码,而是将与高级正则表达式匹配的每个文件的路径和修改日期添加到数组中。
最佳答案
假设这是您将要编写的实际生产代码,那么我建议使用已经解决的此类问题的解决方案 - Apache Commons IO ,特别是 FileUtils.listFiles()
.它处理嵌套目录、过滤器(基于名称、修改时间等)。
例如,对于您的正则表达式:
Collection files = FileUtils.listFiles(
dir,
new RegexFileFilter("^(.*?)"),
DirectoryFileFilter.DIRECTORY
);
这将递归搜索与 ^(.*?)
正则表达式匹配的文件,并将结果作为集合返回。
值得注意的是,这不会比编写自己的代码快,它做的事情是一样的——用 Java 搜索文件系统只是很慢。不同的是,Apache Commons 版本不会有任何错误。
关于java - 使用Java递归列出目录中的所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2534632/