我有一个递归打印目录中所有文件名称的函数。问题是我的代码非常慢,因为每次迭代它都必须访问远程网络设备。
我的计划是首先递归地加载目录中的所有文件,然后使用regex遍历所有文件,以过滤掉我不需要的所有文件。有人有更好的建议吗?
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());
}
}
}
这只是一个稍后的测试,我不会使用这样的代码,而是将匹配高级正则表达式的每个文件的路径和修改日期添加到一个数组中。
发布于 2010-03-29 05:30:05
假设这是您将要编写的实际生产代码,那么我建议使用已经解决这类问题的解决方案- Apache Commons IO,特别是FileUtils.listFiles()
。它处理嵌套目录、过滤器(基于名称、修改时间等)。
例如,对于您的正则表达式:
Collection files = FileUtils.listFiles(
dir,
new RegexFileFilter("^(.*?)"),
DirectoryFileFilter.DIRECTORY
);
这将递归地搜索与^(.*?)
正则表达式匹配的文件,并将结果作为集合返回。
值得注意的是,这不会比滚动您自己的代码更快,它做的是相同的事情-在Java中拖拽文件系统只是很慢。不同的是,Apache Commons版本中没有bug。
发布于 2015-11-02 10:29:53
在Java8中,它是一个通过Files.find()
的1行代码,具有任意大的深度(例如999
)和BasicFileAttributes
of isRegularFile()
public static printFnames(String sDir) {
Files.find(Paths.get(sDir), 999, (p, bfa) -> bfa.isRegularFile()).forEach(System.out::println);
}
要添加更多过滤,请增强lambda,例如在过去24小时内修改的所有jpg文件:
(p, bfa) -> bfa.isRegularFile()
&& p.getFileName().toString().matches(".*\\.jpg")
&& bfa.lastModifiedTime().toMillis() > System.currentMillis() - 86400000
发布于 2014-06-20 17:44:11
这是一个非常简单的递归方法,可以从给定的根目录获取所有文件。
它使用Java7NIO Path类。
private List<String> getFileNames(List<String> fileNames, Path dir) {
try(DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
for (Path path : stream) {
if(path.toFile().isDirectory()) {
getFileNames(fileNames, path);
} else {
fileNames.add(path.toAbsolutePath().toString());
System.out.println(path.getFileName());
}
}
} catch(IOException e) {
e.printStackTrace();
}
return fileNames;
}
https://stackoverflow.com/questions/2534632
复制相似问题