Paths和Files

N1ce2cu發表於2024-08-17

Paths 類

Paths 類主要用於操作檔案和目錄路徑。它提供了一些靜態方法,用於建立java.nio.file.Path例項,代表檔案系統中的路徑。

// 建立一個Path例項,表示當前目錄下的一個檔案
Path path = Paths.get("example.txt");

// 建立一個絕對路徑
Path absolutePath = Paths.get("/home/user/example.txt");

java.nio.file.Path 介面代表一個檔案系統中的路徑。它提供了一系列方法來操作和查詢路徑。

Path path = Paths.get("docs/xx.md");

// 獲取檔名
System.out.println("File name: " + path.getFileName());

// 獲取父目錄
System.out.println("Parent: " + path.getParent());

// 獲取根目錄
System.out.println("Root: " + path.getRoot());

// 將路徑與另一個路徑結合
Path newPath = path.resolve("config/app.properties");
System.out.println("Resolved path: " + newPath);

// 簡化路徑
Path normalizedPath = newPath.normalize();
System.out.println("Normalized path: " + normalizedPath);

// 將相對路徑轉換為絕對路徑
Path absolutePath = path.toAbsolutePath();
System.out.println("Absolute path: " + absolutePath);

// 計算兩個路徑之間的相對路徑
Path basePath = Paths.get("/docs/");
Path targetPath = Paths.get("/docs/imgs/xxx");
Path relativePath = basePath.relativize(targetPath);
System.out.println("Relative path: " + relativePath);

Files 類

java.nio.file.Files類提供了大量靜態方法,用於處理檔案系統中的檔案和目錄。這些方法包括檔案的建立、刪除、複製、移動等操作,以及讀取和設定檔案屬性。

// 建立一個Path例項
Path path = Paths.get("logs/xx.txt");

// 建立一個新檔案
Files.createFile(path);

// 檢查檔案是否存在
boolean exists = Files.exists(path);
System.out.println("File exists: " + exists);

// 刪除檔案
Files.delete(path);

1、exists(Path path, LinkOption... options):檢查檔案或目錄是否存在。

Path path = Paths.get("file.txt");
boolean exists = Files.exists(path);
System.out.println("File exists: " + exists);

LinkOption 是一個列舉類,它定義瞭如何處理檔案系統連結的選項。它位於 java.nio.file 包中。LinkOption 主要在與檔案或目錄的路徑操作相關的方法中使用,以控制這些方法如何處理符號連結。符號連結是一種特殊型別的檔案,它在 Unix 和類 Unix 系統(如 Linux 和 macOS)上很常見。在 Windows 上,類似的概念被稱為快捷方式。

2、createFile(Path path, FileAttribute<?>... attrs):建立一個新的空檔案。

Path newPath = Paths.get("newFile.txt");
Files.createFile(newPath);

FileAttribute 是一個泛型介面,用於處理各種不同型別的屬性。在使用 FileAttribute 時,你需要為其提供一個特定的實現。java.nio.file.attribute 包中的 PosixFileAttributes 類提供了 POSIX(Portable Operating System Interface,定義了許多與檔案系統相關的操作,包括檔案和目錄的建立、刪除、讀取和修改。)檔案屬性的實現。

Path path = Paths.get("fileWithPermissions.txt");

Set<PosixFilePermission> permissions = PosixFilePermissions.fromString("rw-r-----");
FileAttribute<Set<PosixFilePermission>> fileAttribute = PosixFilePermissions.asFileAttribute(permissions);

Files.createFile(path, fileAttribute);

PosixFileAttributes 介面提供了獲取 POSIX 檔案屬性的方法,如檔案所有者、檔案所屬的組以及檔案的訪問許可權。以上示例會建立一個讀寫屬性的檔案。

3、createDirectory(Path dir, FileAttribute<?>... attrs):建立一個新的目錄。

Path newDir = Paths.get("newDirectory");
Files.createDirectory(newDir);

4、delete(Path path):刪除檔案或目錄。

Path pathToDelete = Paths.get("fileToDelete.txt");
Files.delete(pathToDelete);

5、copy(Path source, Path target, CopyOption... options):複製檔案或目錄。

Path sourcePath = Paths.get("sourceFile.txt");
Path targetPath = Paths.get("targetFile.txt");
Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);

在 Java NIO 中,有兩個實現了 CopyOption 介面的列舉類:StandardCopyOption 和 LinkOption。

StandardCopyOption 列舉類提供了以下兩個選項:

  • REPLACE_EXISTING:如果目標檔案已經存在,該選項會使 Files.copy() 方法替換目標檔案。如果不指定此選項,Files.copy() 方法在目標檔案已存在時將丟擲 FileAlreadyExistsException。
  • COPY_ATTRIBUTES:此選項表示在複製檔案時,儘可能地複製檔案的屬性(如檔案時間戳、許可權等)。如果不指定此選項,那麼目標檔案將具有預設的屬性。

6、move(Path source, Path target, CopyOption... options):移動或重新命名檔案或目錄。

Path sourcePath = Paths.get("sourceFile.txt");
Path targetPath = Paths.get("targetFile.txt");
Files.move(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);

7、readAllLines(Path path, Charset cs):讀取檔案的所有行到一個字串列表。

Path path = Paths.get("file.txt");
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
lines.forEach(System.out::println);

8、write(Path path, Iterable<? extends CharSequence> lines, Charset cs, OpenOption... options):將字串列表寫入檔案。

Path path = Paths.get("file.txt");
List<String> lines = Arrays.asList("1", "2", "3");
Files.write(path, lines, StandardCharsets.UTF_8);

OpenOption 是 Java NIO 中一個用於配置檔案操作的介面。它提供了在使用 Files.newByteChannel()Files.newInputStream()Files.newOutputStream()AsynchronousFileChannel.open()FileChannel.open() 方法時定製行為的選項。

在 Java NIO 中,有兩個實現了 OpenOption 介面的列舉類:StandardOpenOption 和 LinkOption。

StandardOpenOption 列舉類提供了以下幾個選項:

  • READ:以讀取模式開啟檔案。
  • WRITE:以寫入模式開啟檔案。
  • APPEND:以追加模式開啟檔案。
  • TRUNCATE_EXISTING:在開啟檔案時,截斷檔案的內容,使其長度為 0。僅適用於 WRITE 或 APPEND 模式。
  • CREATE:當檔案不存在時建立檔案。如果檔案已存在,則開啟檔案。
  • CREATE_NEW:當檔案不存在時建立檔案。如果檔案已存在,丟擲 FileAlreadyExistsException。
  • DELETE_ON_CLOSE:在關閉通道時刪除檔案。
  • SPARSE:提示檔案系統建立一個稀疏檔案。
  • SYNC:要求每次更新檔案的內容或後設資料時都進行同步。
  • DSYNC:要求每次更新檔案內容時都進行同步。

8、newBufferedReader(Path path, Charset cs) 和 newBufferedWriter(Path path, Charset cs, OpenOption... options):建立 BufferedReader 和 BufferedWriter 物件以讀取和寫入檔案。

Path path = Paths.get("file.txt");

// Read file
try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
}

// Write file
Path outputPath = Paths.get("outputFile.txt");
try (BufferedWriter writer = Files.newBufferedWriter(outputPath, StandardCharsets.UTF_8)) {
    writer.write("xx");
}

Files.walkFileTree() 靜態方法

這個方法可以遞迴地訪問目錄結構中的所有檔案和目錄,並允許您對這些檔案和目錄執行自定義操作。使用 walkFileTree 方法時,需要提供一個起始路徑(起始目錄)和一個實現了 FileVisitor 介面的物件。FileVisitor 介面包含四個方法,它們在遍歷過程中的不同階段被呼叫:

  • preVisitDirectory:在訪問目錄之前呼叫。
  • postVisitDirectory:在訪問目錄之後呼叫。
  • visitFile:在訪問檔案時呼叫。
  • visitFileFailed:在訪問檔案失敗時呼叫。
public static void main(String[] args) {
    Path startingDir = Paths.get("docs");
    MyFileVisitor fileVisitor = new MyFileVisitor();

    try {
        Files.walkFileTree(startingDir, fileVisitor);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private static class MyFileVisitor extends SimpleFileVisitor<Path> {
    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
        System.out.println("準備訪問目錄: " + dir);
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
        System.out.println("正在訪問目錄: " + dir);
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        System.out.println("訪問檔案: " + file);
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
        System.err.println("訪問檔案失敗: " + file);
        return FileVisitResult.CONTINUE;
    }
}

其中,FileVisitResult 列舉包含以下四個選項:

  • CONTINUE : 繼續
  • TERMINATE : 終止
  • SKIP_SIBLINGS : 跳過兄弟節點,然後繼續
  • SKIP_SUBTREE : 跳過子樹(不訪問此目錄的條目),然後繼續,僅在 preVisitDirectory 方法返回時才有意義,除此以外和 CONTINUE 相同。

搜尋檔案

public static void main(String[] args) {
    Path startingDir = Paths.get("./");
    String targetFileName = "hello.txt";
    FindFileVisitor findFileVisitor = new FindFileVisitor(targetFileName);

    try {
        Files.walkFileTree(startingDir, findFileVisitor);
        if (findFileVisitor.isFileFound()) {
            System.out.println("找到檔案了: " + findFileVisitor.getFoundFilePath());
        } else {
            System.out.println("ooh,檔案沒找到");
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private static class FindFileVisitor extends SimpleFileVisitor<Path> {
    private final String targetFileName;
    private Path foundFilePath;

    public FindFileVisitor(String targetFileName) {
        this.targetFileName = targetFileName;
    }

    public boolean isFileFound() {
        return foundFilePath != null;
    }

    public Path getFoundFilePath() {
        return foundFilePath;
    }

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        String fileName = file.getFileName().toString();
        if (fileName.equals(targetFileName)) {
            foundFilePath = file;
            return FileVisitResult.TERMINATE;
        }
        return FileVisitResult.CONTINUE;
    }
}

Paths 和 Files 是 Java NIO 中的兩個核心類。Paths 提供了一系列靜態方法,用於操作路徑(Path 物件)。它可以將字串或 URI 轉換為 Path 物件,方便後續操作。Files 類提供了豐富的檔案操作方法,如檔案的建立、刪除、移動、複製、讀取和寫入等。這些方法支援各種選項和屬性,如覆蓋、保留屬性和符號連結處理。Files 還支援檔案遍歷(如 walkFileTree 方法),可以處理檔案目錄樹。總之,Paths 和 Files 為檔案和目錄操作提供了簡潔、高效的方法。

相關文章