以下代码遍历所有目录和子目录,并仅输出.java文件;
import java.io.File;
public class DirectoryReader {
private static String extension = "none";
private static String fileName;
public static void main(String[] args ){
String dir = "C:/tmp";
File aFile = new File(dir);
ReadDirectory(aFile);
}
private static void ReadDirectory(File aFile) {
File[] listOfFiles = aFile.listFiles();
if (aFile.isDirectory()) {
listOfFiles = aFile.listFiles();
if(listOfFiles!=null) {
for(int i=0; i < listOfFiles.length; i++ ) {
if (listOfFiles[i].isFile()) {
fileName = listOfFiles[i].toString();
int dotPos = fileName.lastIndexOf(".");
if (dotPos > 0) {
extension = fileName.substring(dotPos);
}
if (extension.equals(".java")) {
System.out.println("FILE:" + listOfFiles[i] );
}
}
if(listOfFiles[i].isDirectory()) {
ReadDirectory(listOfFiles[i]);
}
}
}
}
}
}
效率这么高吗?可以做些什么来提高速度?
欢迎所有想法。
答案 0 :(得分:3)
在Java 7中,我会考虑以下内容:
Files.walkFileTree(aFile.toPath(), new SimpleFileVisitor<Path>()
{
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
{
if(file.getFileName().endsWith(".java")
{
System.out.println("FILE:" + file );
}
return FileVisitResult.CONTINUE;
}
});
这可能不会更快,但我发现它更具可读性。
编辑:我删除了当前的Java示例。 listFiles
不是递归的,所以你可以使用它,但你必须使用自己的递归。您还需要两个listFiles
调用(对于Java文件和目录),或者您需要一个匹配两者的FileFilter
。在后一种情况下,您必须检查返回数组中的每个文件以查看它是什么。
答案 1 :(得分:2)
我的评论:
可能的错误:extension
未重置。想想如果你遇到file1.java
和那个file2
(没有.
- 字符会发生什么?)
建议:放
if (extension.equals(".java"))
System.out.println("FILE:" + listOfFiles[i] );
if (dotPos > 0)
ReadDirectory
是一种方法,应该符合惯例的首字母小:readDirectory
您可以使用for-each循环清理代码:
for(File f : listOfFiles) {
if (f.isFile()) {
// ...
}
if(f.isDirectory()) {
readDirectory(f);
}
}
答案 2 :(得分:0)
使用StringBuffer而不是System.out。递归总是较慢,尽管更简洁。