JDK 7 引入 java.nio.file 套件,Path、Files、FileSystem 取代老舊 java.io.File,提供更豐富功能、更佳效能、支援符號連結、屬性讀寫、目錄遍歷流式處理。
Path p1 = Paths.get("/home", "user", "docs"); // 組合路徑
Path p2 = Paths.get(uri); // URI 轉換
Path abs = p1.toAbsolutePath(); // 絕對路徑
Path rel = base.relativize(target); // 相對路徑
File legacy = p1.toFile(); // 互通舊 API
// 建立
Files.createDirectories(path); // 遞歸建立目錄
Files.createFile(path); // 建立檔案(已存在拋異常)
Files.createTempFile(prefix, suffix); // 建立臨時檔案
// 刪除
Files.delete(path); // 不存在拋異常
Files.deleteIfExists(path); // 靜默刪除
// 移動/重命名/複製
Files.move(src, target, REPLACE_EXISTING, ATOMIC_MOVE);
Files.copy(src, target, COPY_ATTRIBUTES);
BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class);
attr.creationTime(); attr.lastModifiedTime(); attr.size(); attr.isDirectory();
// POSIX 權限(Linux/Mac)
Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rw-r--r--");
Files.setPosixFilePermissions(path, perms);
// 讀取所有行 → Stream
try (Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8)) {
lines.filter(s -> !s.startsWith("#"))
.map(String::trim)
.forEach(System.out::println);
}
// 一次性讀寫小檔案
List<String> all = Files.readAllLines(path, StandardCharsets.UTF_8);
Files.write(path, content.getBytes(StandardCharsets.UTF_8),
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
// 大檔案流式複製
try (InputStream in = Files.newInputStream(src);
OutputStream out = Files.newOutputStream(dst)) {
in.transferTo(out); // JDK 9+
}
// 深度遍歷(Stream,可並行)
try (Stream<Path> walk = Files.walk(root, 3, FileVisitOption.FOLLOW_LINKS)) {
walk.filter(Files::isRegularFile)
.filter(p -> p.toString().endsWith(".java"))
.forEach(System.out::println);
}
// 目錄變更監控(WatchService)
WatchService ws = FileSystems.getDefault().newWatchService();
root.register(ws, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
while (true) {
WatchKey key = ws.take();
for (WatchEvent<?> ev : key.pollEvents()) {
System.out.println(ev.kind() + ": " + ev.context());
}
key.reset();
}
StandardCharsets.UTF_8,避免平台預設編碼差異Files.newInputStream + transferTo 或緩衝區分塊處理Files.move(tmp, target, ATOMIC_MOVE) 防止部分寫入normalize()、檢查 startsWith(baseDir)| 舊 API (java.io.File) | 新 API (java.nio.file) |
|---|---|
file.exists() | Files.exists(path) / Files.notExists(path) |
file.mkdirs() | Files.createDirectories(path) |
file.listFiles() | Files.list(dir) / Files.walk(dir) |
file.renameTo(dest) | Files.move(src, dest, REPLACE_EXISTING) |
new FileInputStream(file) | Files.newInputStream(path) |