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 中的說明,在此就不多加解釋了
因為自己也是突然有需要才略為研究一下,所以目前也只有一些簡單的紀錄,之後有空研究的話再來更新了