代码之家  ›  专栏  ›  技术社区  ›  Adnan

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

  •  2
  • Adnan  · 技术社区  · 16 年前

    下面的代码遍历所有目录和子目录并输出.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 回复  |  直到 11 年前
        1
  •  2
  •   aioobe    16 年前

    我的评论:

    • 可能的错误: 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
  •  3
  •   Matthew Flaschen    11 年前

    在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 不是递归的,所以您可以使用它,但是您必须使用自己的递归。你也需要两个 列表文件 调用(对于Java文件和目录),或者您需要 FileFilter 两者都匹配。在后一种情况下,您必须检查返回数组中的每个文件,以查看它是哪个文件。

        3
  •  0
  •   Lukasz    16 年前

    使用StringBuffer而不是System.Out。递归总是较慢,但更简洁。