从目录中读取文件并从Java中过滤文件

时间:2010-06-10 09:17:43

标签: java performance

以下代码遍历所有目录和子目录,并仅输出.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]);
                    }
                }
            }
        }
    }


}

效率这么高吗?可以做些什么来提高速度?

欢迎所有想法。

3 个答案:

答案 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。递归总是较慢,尽管更简洁。