我有此功能,以递归方式打印目录中所有文件的名称。问题是我的代码很慢,因为它每次迭代都必须访问远程网络设备。
我的计划是先从目录中递归加载所有文件,然后再使用正则表达式遍历所有文件,以过滤掉我不需要的所有文件。有谁有更好的建议?
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 IOFileUtils.listFiles()。它处理嵌套目录,过滤器(基于名称,修改时间等)。
Apache Commons IOFileUtils.listFiles()
例如,对于你的正则表达式:
Collection files = FileUtils.listFiles( dir, new RegexFileFilter("^(.*?)"), DirectoryFileFilter.DIRECTORY );
这将递归搜索与^(.*?)正则表达式匹配的文件,并以集合的形式返回结果。
^(.*?)
值得注意的是,这不会比滚动自己的代码快,它的作用相同-用Java拖曳文件系统只是很慢。所不同的是,Apache Commons版本将没有错误。