在目录中搜索特定模式的文件

时间:2014-08-07 00:39:41

标签: java file recursion

Java 中,如何针对特定模式的文件递归检查文件夹?我在网上很多帖子中都看过以下代码:

public static void findFiles() throws IOException {
    File dir = new File(".");
    FileFilter fileFilter = new WildcardFileFilter("*.txt");
    File[] files = dir.listFiles(fileFilter);
    for (int i = 0; i < files.length; i++) {
       System.out.println(files[i]);
    }
}

在我的应用程序中,我基本上需要检查用户主目录中与*.txt匹配的文件。

由于每个用户的路径会有所不同,如何使用此代码在 filesystem 的任何位置搜索与模式匹配的文件?

1 个答案:

答案 0 :(得分:2)

你实际上可以简单地使用:

final File dir = new File(System.getProperty("user.home"));

这会将dir设置为您用户的home目录。从那里,你只需要列出所有.txt文件,而不是递归;)


但是,如果您仍希望以递归方式列出目录中的所有文件,则可以使用以下方法:

public static List<File> walk(final File root, final String extension) {
    final File[] list = root.listFiles();
    if (list == null) {
        return Collections.EMPTY_LIST;
    }

    final List<File> res = new ArrayList<>();
    for (final File f : list) {
        if (f.isDirectory()) {
            res.addAll(walk(f, extension));
        } else {
            if (f.getName().endsWith(extension)) {
                res.add(f);
            }
        }
    }

    return res;
}

您可以按如下方式使用它:

public static void main(final String[] args) {
    for (final File file : walk(new File("/home/user3751169"), ".txt")) {
        System.out.println(file.getAbsolutePath());
    }
}

另一方面,如果您只想查看当前用户的home目录中的文件,则应删除对walk()的递归调用:

public static List<File> walk(final File root, final String extension) {
    final File[] list = root.listFiles();
    if (list == null) {
        return Collections.EMPTY_LIST;
    }

    final List<File> res = new ArrayList<>();
    for (final File f : list) {
        if (f.isFile() && f.getName().endsWith(extension)) {
            res.add(f);
        }
    }

    return res;
}