Java 7 後建議使用 NIO2 API 處理目錄相關操作
新的 API 實作相對過去的方式有一些好處
1. 更好的效能
2. 能處理 symbolic link 等非實體存在的目錄、檔案
3. 搭配 Java 8 開始的 Stream API 能有更方便的寫法
寫法如下:
Path zippedPath = Paths.get(file.getAbsolutePath());
try {
Files.walkFileTree(walkedPath, new FileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path directory, IOException ioe)
throws IOException {
Files.delete(directory);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attributes)
throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException ioe)
throws IOException {
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
System.out.print(e);
}
如果需要處理的只有部分狀況,可以使用 SimpleFileVisitor 取代 FileVisitor
這樣可以少寫一些override的code
新的 API 實作相對過去的方式有一些好處
1. 更好的效能
2. 能處理 symbolic link 等非實體存在的目錄、檔案
3. 搭配 Java 8 開始的 Stream API 能有更方便的寫法
寫法如下:
Path zippedPath = Paths.get(file.getAbsolutePath());
try {
Files.walkFileTree(walkedPath, new FileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path directory, IOException ioe)
throws IOException {
Files.delete(directory);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attributes)
throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException ioe)
throws IOException {
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
System.out.print(e);
}
如果需要處理的只有部分狀況,可以使用 SimpleFileVisitor 取代 FileVisitor
這樣可以少寫一些override的code
留言
張貼留言