【问题标题】:read files from directory and filter files from Java从目录中读取文件并从 Java 中过滤文件
【发布时间】:2010-06-10 09:17:43
【问题描述】:

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


}

这样有效吗?有什么办法可以提高速度?

欢迎所有想法。

【问题讨论】:

  • 有一个错误:没有扩展名的文件将被视为程序看到的最后一个扩展名。无需调用 listFiles 两次。使用 .getPath() 而不是 .toString() 来获取文件路径(结果相同,可读性更好)

标签: java performance


【解决方案1】:

在 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。在后一种情况下,您必须检查返回数组中的每个文件以查看它是什么。

【讨论】:

  • file.getName() 应替换为 file.getFileName(),因为 getName(index) 期望作为参数返回的元素名称
【解决方案2】:

我的cmets:

  • 可能的错误:extension 未重置。想想如果遇到file1.javafile2 会发生什么(没有. 字符?)

    建议:放

    if (extension.equals(".java"))
        System.out.println("FILE:" + listOfFiles[i] );
    

    if (dotPos &gt; 0) 的正文内部

  • ReadDirectory 是一个方法,按照惯例应该有小的首字母:readDirectory

  • 您可以使用 for-each 循环稍微清理一下代码:

    for(File f : listOfFiles) {
        if (f.isFile()) {
            // ...
        }           
        if(f.isDirectory()) {
            readDirectory(f);
        }
    }
    

【讨论】:

    【解决方案3】:

    使用 StringBuffer 代替 System.out。尽管更简洁,但递归总是更慢。

    【讨论】:

      猜你喜欢
      • 2020-09-02
      • 2012-11-22
      • 1970-01-01
      • 2015-04-22
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多