根据 java 中的正则表达式过滤子目录

Filter subdirectories based on regex in java

我的目录结构如下:

/test_directory/data/date=2021-01-01/
/test_directory/data/date=2021-01-02/
/test_directory/data/date=2021-01-03/
/test_directory/data/sample=2021-01-04/
/test_directory/data/sample=2021-01-05/

我只想过滤日期文件夹。

/test_directory/data/date=2021-01-01/
/test_directory/data/date=2021-01-02/
/test_directory/data/date=2021-01-03/

我厌倦了下面的代码:但是无法将正则表达式保留在目录路径中。

String dir = "/test_directory/data/";
File[] directories = new File(dir).listFiles(File::isDirectory);
for(int i=0;i< directories.length;i++){
    System.out.println(directories[i]);
}

首先,让我们迁移到 nio API,这是为了取代 Java 1.7 以来的 File API。

String dir = "/test_directory/data/";
Files.list(Paths.get(dir))
    .filter(Files::isDirectory)
    .forEach(directory -> {
        System.out.println(directory.toString());
    };

此时,由于您有一个 Stream,您可以轻松地添加一个额外的过滤器。这可以是基于正则表达式的,也可以只是一个简单的 String.startsWith.

String dir = "/test_directory/data/";
Files.list(Paths.get(dir))
    .filter(Files::isDirectory)
    .filter(directory -> directory.getFileName().toString().startsWith("date"))
    .forEach(directory -> {
        System.out.println(directory.toString());
    };

使用FileAPI,不能有多个滤镜,需要自己组合。

String dir = "/test_directory/data/";
File[] directories = new File(dir).listFiles(
    directory -> directory.isDirectory()
 && directory.getName().startsWith("date"));
for (File directory : directories) {
    System.out.println(directory.getPath());
}