读取Java中的子目录和特定文件

时间:2019-05-26 08:58:01

标签: java spring

我需要在目录中找到所有Java文件

    private void search(File directory) {
        if (directory.isDirectory()) {
            File[] javaFilesLs = directory.listFiles(new FilenameFilter() {
                public boolean accept(File dir, String name) {
                  return name.toLowerCase().endsWith(".java");
//                return name.toLowerCase().endsWith(".java") || dir.isDirectory();
                }
            });
            if (directory.canRead()) {
                assert javaFilesLs != null;
                for (File temp : javaFilesLs) {
                    if (temp.isDirectory()) {
                        search(temp);
                    } else {
                        fileList.add(temp.getAbsolutePath());
                    }
                }
            }
        }
    }

使用注释行时,它会找到子目录和所有文件,而不仅仅是".java"个文件。

1 个答案:

答案 0 :(得分:2)

使用注释行获取所有路径的原因是dir.isDirectory()将为所有文件返回true。 看一下FilenameFilter的文档。它指定dir“在其中找到文件的目录。”

因此,您不必检查dir,而必须检查name是否代表目录。也许有更聪明的方法,但是可以这样:

new File(dir.toPath().toString(), name).isDirectory() // returns true for directories

整个代码段如下所示:

private void search(File directory) {
    if (directory.isDirectory()) {
        File[] javaFilesLs = directory.listFiles(new FilenameFilter() {
            public boolean accept(File dir, String name) {
                return name.toLowerCase().endsWith(".java") || new File(dir.toPath().toString(), name).isDirectory();
            }
        });
        if (directory.canRead()) {
            assert javaFilesLs != null;
            for (File temp : javaFilesLs) {
                if (temp.isDirectory()) {
                    search(temp);
                } else {
                    fileList.add(temp.getAbsolutePath());
                }
            }
        }
    }
}

或者,Java 8添加了Files.walk,它为您实现了作为流的递归。

private void search(File directory) throws IOException {
    Files.walk(directory.toPath())
        .filter(f -> {
            return f.getFileName().toString().endsWith(".java");
        })
        .forEach(f -> fileList.add(f.toFile().getAbsolutePath()));
}