Java Recursive Files with NIO

  • 134
  • 0

Java 在有 NIO 後,有許多好用的新功能,紀錄一下自己簡單嘗試後的結果

透過 Files.walk 搭配 Lambda 的新功能來實現走訪路徑下所有檔案

Path path = Paths.get("C:\\");
Files.walk(path).forEach(System.out::println);

以上方法只會走訪該路徑下的所有檔案,如果想要找資料夾的化可以使用 lambda 的 filter

Path path = Paths.get("C:\\");
Files.walk(path).filter(Files.isDirectory).forEach(System.out::println);

另外 Files.walk 還可以指定要走訪幾層,以下方法可以只走訪當前路徑和當前路徑的下一層,0 代表目前路徑,1 則是當前路徑的下一層,以此類推

Path path = Paths.get("C:\\");
Files.walk(path,1).forEach(System.out::println);

 

除了使用 Files.walk 以外,還可以使用 DirectoryStream 來走訪,以下方式會走訪目前指定目錄的下一層

Path path = Paths.get("C:\\");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)){
    for(Path dir:stream) {
        System.out.println(dir);
    }
}

若要走訪整個目錄下的所有檔案和路徑則要使用遞迴

public void listDir(Path path) throws IOException {
    try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)){
        for(Path dir:stream) {
            if(Files.isDirectory(dir)) {
                listDir(path);
            }
            System.out.println(dir);
        }
    }
}

另外也可以在 newDirectoryStream() 多指定一個參數,用來篩選符合特定條件的檔案,以下是找出附檔名為 csv 的檔案

public void listDir(Path path) throws IOException {
    try (DirectoryStream<Path> stream = Files.newDirectoryStream(path, "*.csv")){
        for(Path dir:stream) {
            System.out.println(dir);
        }
    }
}

至於 newDirectoryStream() 的第二個參數的規則,可以參考 FileSystem 的 gePathtMatcher 中的說明,在此就不多加解釋了

 

因為自己也是突然有需要才略為研究一下,所以目前也只有一些簡單的紀錄,之後有空研究的話再來更新了