首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 文件操作大全:Path、Files、Stream API 現代實戰指南

     編輯:Java 程式設計入門

從 File 到 Path:現代化 API 遷移

JDK 7 引入 java.nio.file 套件,Path、Files、FileSystem 取代老舊 java.io.File,提供更豐富功能、更佳效能、支援符號連結、屬性讀寫、目錄遍歷流式處理。

核心操作速查表

1. 路徑建構與轉換

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

2. 檔案/目錄 CRUD

// 建立
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);

3. 屬性與權限

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);

4. 內容讀寫(Stream API 風格)

// 讀取所有行 → 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+
}

5. 目錄遍歷與監控

// 深度遍歷(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,避免平台預設編碼差異
  • try-with-resources 管理資源:Stream、InputStream、WatchKey 皆實作 AutoCloseable
  • 大檔案避免 readAllBytes:使用 Files.newInputStream + transferTo 或緩衝區分塊處理
  • 原子性寫入:先寫臨時檔 Files.move(tmp, target, ATOMIC_MOVE) 防止部分寫入
  • 路徑注入防範:用戶輸入路徑需 normalize()、檢查 startsWith(baseDir)

舊代碼遷移對照

全面擁抱 NIO.2,讓文件操作代碼更簡潔、更健壯、更現代化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
舊 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)