欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用java.nio.file?庫優(yōu)雅的操作文件詳解

 更新時間:2023年05月10日 08:14:26   作者:小二十七  
這篇文章主要介紹了使用java.nio.file?庫優(yōu)雅的操作文件詳解,需要的朋友可以參考下

概述

在早期的 Java 版本中,文件 IO 操作功能一直相對較弱,主要存在以下問題:

  • 缺乏對現(xiàn)代文件系統(tǒng)的支持:只提供的基礎(chǔ)的文件操作,不支持很多現(xiàn)代的文件系統(tǒng)
  • API 不夠直觀:文件操作的 API 設(shè)計相對較為復雜和冗長,使用體驗感很差
  • 對于大文件處理和并發(fā)性能不夠:簡單的 I/O 模型,沒有充分利用現(xiàn)代硬件的性能優(yōu)勢,而且還有很多同步的問題

但 Java 在后期版本中引入了 java.nio.file 庫來提高 Java 對文件操作的能力。還增加的流的功能,似乎使得文件變成更好用了。所以本章,我們就來主要介紹 java.nio.file 中常用的類和模塊,大致如下:

  • Path 路徑:Paths 模塊和 Path 工具類介紹
  • Files 文件:File 和 FileSystems 工具類介紹
  • 文件管理服務:WatchService 、PathMatcher 等等文件服務

Path 路徑

java.nio.file.Paths 和 java.nio.file.Path 類在 Java NIO 文件 I/O 框架中用于處理文件系統(tǒng)路徑。以下是對它們的簡單介紹:

  • Paths 模塊:Paths 模塊提供了一些靜態(tài)方法來創(chuàng)建 Path 對象,Path 對象表示文件系統(tǒng)中的路徑。例如,可以使用 Paths.get() 方法創(chuàng)建一個 Path 對象,這個對象表示一個文件路徑。
  • Path 類:Path 類代表一個文件系統(tǒng)中的路徑,它提供了一系列的方法來操作文件路徑。例如,可以使用 Path.toAbsolutePath() 方法獲取一個絕對路徑,或者使用 Path.getParent() 方法獲取路徑的父路徑。

關(guān)于跨平臺:Path 對象可以工作在不同操作系統(tǒng)的不同文件系統(tǒng)之上,它幫我們屏蔽了操作系統(tǒng)之間的差異

以下是一些簡單使用場景示例:

import java.nio.file.Path;
import java.nio.file.Paths;

public class PathExample {

    public static void main(String[] args) {
        // 創(chuàng)建一個絕對路徑
        Path absolutePath = Paths.get("C:\\Users\\phoenix\\file.txt");     // 這里傳入 "example\\file.txt" 創(chuàng)建的相對路徑
        System.out.println("Absolute path: " + absolutePath);
        // 獲取父路徑
        System.out.println("Parent path: " + absolutePath.getParent());
        // 獲取文件名
        System.out.println("File name: " + absolutePath.getFileName());
        // 獲取根路徑
        System.out.println("Root path: " + absolutePath.getRoot());
        // 合并路徑
        Path resolvePath = Paths.get("C:\\Users\\phoenix").resolve("file.txt");
        System.out.println("Merged path:" + resolvePath);
    }
}

輸出結(jié)果:

Absolute path: C:\Users\phoenix\file.txt
Parent path: C:\Users\phoenix
File name: file.txt
Root path: C:\
Merged path:C:\Users\phoenix\file.txt

從這里你不僅可以看出關(guān)于 Paths 和 Path 類對于文件路徑的一些操作方法的使用,還能看得出我使用的是 Windows 操作系統(tǒng)。還有更多的用法可以查看官方的 API 文檔,這里就不過多贅述了。

Files 文件

java.nio.file.Files 類是 Java NIO 文件包中的一個實用工具類,它提供了一系列靜態(tài)方法,可以讓你方便地執(zhí)行文件系統(tǒng)中的各種操作,例如文件的創(chuàng)建、刪除、復制、移動、讀取和寫入等。例如,可以使用 Files.exists() 方法檢查一個文件是否存在,或者使用 Files.createDirectory() 方法創(chuàng)建一個新目錄。

以下是一些簡單使用場景示例:

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.Arrays;
import java.util.List;

public class PathExample {

    public static void main(String[] args) throws IOException {
        Path path = Paths.get("example.txt");
        // 1:檢查文件是否存在
        boolean exists = Files.exists(path);
        System.out.println("File exists: " + exists);
        if (!exists) {
            // 2:不存在則創(chuàng)建文件
            Files.createFile(path);
        }
        // 3:復制一個文件
        Path target = Paths.get("example2.txt");
        Files.copy(path, target, StandardCopyOption.REPLACE_EXISTING);
        // 4:創(chuàng)建目錄
        Path newDirectory = Paths.get("example");
        Files.createDirectories(newDirectory);
        // 4:移動文件:將 example2.txt 移動到 example 目錄下
        Files.move(target, newDirectory.resolve("example2.txt"), StandardCopyOption.REPLACE_EXISTING);
        // 5:刪除文件和目錄
        Files.delete(newDirectory.resolve("example2.txt"));
        Files.delete(newDirectory);				// 只能刪除空目錄
        // 6:將字節(jié)數(shù)組寫入文件
        Files.write(path, "Hello World".getBytes());
        // 7:將文本行序列寫入文件
        List<String> lines = Arrays.asList("Line 1", "Line 2", "Line 3");
        Files.write(path, lines, StandardCharsets.UTF_8, StandardOpenOption.CREATE);
        // 8:讀取文件,并且打印所有行
        Files.readAllLines(path, StandardCharsets.UTF_8).forEach(System.out::println);
    }
}

輸出結(jié)果:

File exists: true
Line 1
Line 2
Line 3

也可以在項目根目錄下查看文件:

以上代碼示例展示了如何使用 Files 類進行常見的文件操作。在實際項目中,您可以根據(jù)需要組合使用這些方法來滿足您的需求。

補充:

Files.delete 函數(shù)只能刪除空目錄,這個設(shè)計是有意為之的,因為遞歸地刪除文件和目錄可能是一個非常危險的操作,尤其是當您不小心刪除了一個包含重要數(shù)據(jù)的目錄時。如果您想刪除一個包含子目錄和文件的目錄,您需要先遞歸地刪除目錄中的所有子目錄和文件,然后再刪除目錄本身??梢越柚?nbsp;Files.walkFileTree 遍歷文件目錄,然后調(diào)用 Files.delete 即可。

FileSystems 文件系統(tǒng)

FileSystems 類提供了一組靜態(tài)方法來訪問和操作默認文件系統(tǒng)(通常是操作系統(tǒng)的本地文件系統(tǒng))以及其他文件系統(tǒng)實現(xiàn)。以下是一個簡單的示例:

public class FileSystemsExample {

    public static void main(String[] args) {
        // 獲取默認文件系統(tǒng)
        FileSystem fileSystem = FileSystems.getDefault();
        // 獲取文件系統(tǒng)的路徑分隔符
        String pathSeparator = fileSystem.getSeparator();
        System.out.println("Path separator: " + pathSeparator);
        // 獲取文件系統(tǒng)的根目錄
        for (Path root : fileSystem.getRootDirectories()) {
            System.out.println("Root directory: " + root);
        }
        // 使用文件系統(tǒng)創(chuàng)建一個 path 路徑對象
        Path path = fileSystem.getPath("path", "to", "file.txt");
        System.out.println(path);
        // 是否只讀
        System.out.println("is read only ?: " + fileSystem.isReadOnly());
        // 文件系統(tǒng)的提供者
        System.out.println("provider: " + fileSystem.provider());
    }
}

輸出結(jié)果:

Path separator: \
Root directory: C:\
path\to\file.txt
is read only ?: false
provider: sun.nio.fs.WindowsFileSystemProvider@5b480cf9

FileSystem 工具類的方法并不多,可以參考它的 API,但通過 FileSystem 可以創(chuàng)建 WatchService 和 PathMatcher 子類

WatchService 文件監(jiān)控

WatchService 是一個文件系統(tǒng)觀察者,基于 FileSystem 創(chuàng)建,主要用于監(jiān)控文件系統(tǒng)事件(如創(chuàng)建、修改、刪除文件或目錄)。它可以幫助我們實時地檢測和處理文件系統(tǒng)中的變化。如果你的業(yè)務中有需要監(jiān)控文件變化的場景,你可能會需要用到它,例如:

  • 文件上傳
  • 實時備份
  • 熱加載配置

以下是一個簡單的示例:

import java.io.IOException;
import java.nio.file.*;

public class WatchServiceExample {

    public static void main(String[] args) throws IOException, InterruptedException {
        // 創(chuàng)建 WatchService
        WatchService watchService = FileSystems.getDefault().newWatchService();

        // 注冊監(jiān)聽指定的目錄
        Path dir = Paths.get("C:\\Users\\phoenix");
        dir.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);

        while (true) {
            // 獲取并處理事件
            WatchKey key = watchService.take();
            for (WatchEvent<?> event : key.pollEvents()) {
                System.out.println("Event: " + event.kind() + " - " + event.context());
            }

            // 重置 key,繼續(xù)監(jiān)聽
            if (!key.reset()) {
                break;
            }
        }
        watchService.close();
    }
}

啟動以上程序,程序就會監(jiān)控我當前系統(tǒng)的用戶目錄,當我在用戶目錄創(chuàng)建文件并且編輯,刪除,程序會輸出以下內(nèi)容:

Event: ENTRY_CREATE - 新建 文本文檔.txt
Event: ENTRY_DELETE - 新建 文本文檔.txt
Event: ENTRY_CREATE - helloWorld.txt
Event: ENTRY_MODIFY - helloWorld.txt
Event: ENTRY_MODIFY - helloWorld.txt
Event: ENTRY_MODIFY - helloWorld.txt
Event: ENTRY_DELETE - helloWorld.txt

PathMatcher 文件匹配

PathMatcher 是一個文件路徑匹配接口,它可以幫助我們在遍歷文件系統(tǒng)時,根據(jù)特定規(guī)則過濾出符合條件的文件或目錄。它可以使用多種匹配語法(如 glob 和 regex),使得處理文件名或目錄名的模式變得更加靈活和高效。PathMatcher 的使用場景包括:

  • 文件過濾:在搜索文件時,我們可能需要根據(jù)文件名或目錄名的模式來過濾結(jié)果
  • 批量操作:當我們需要對文件系統(tǒng)中的一組文件或目錄執(zhí)行批量操作時,PathMatcher 可以幫助我們找到符合特定規(guī)則的文件或目錄
  • 目錄監(jiān)控:可以結(jié)合 WatchService 對目錄監(jiān)控,然后通過 PathMatcher 過濾找出我們想要文件,如:.log 文件的創(chuàng)建,修改等

以下是一個簡單示例代碼:

import java.io.IOException;
import java.nio.file.*;
import java.util.stream.Stream;

public class PathMatcherExample {

    public static void main(String[] args) throws IOException {
        // 創(chuàng)建 PathMatcher,使用 glob 語法:匹配所有以 .tmp 結(jié)尾的文件(臨時文件)
        FileSystem fileSystem = FileSystems.getDefault();
        PathMatcher matcher = fileSystem.getPathMatcher("glob:*.tmp");
        // 在指定目錄,找到匹配的文件,然后進行刪除
        try (Stream<Path> walk = Files.walk(Paths.get("path/to/directory"))) {
            walk.filter(path -> matcher.matches(path.getFileName())).forEach(path -> {
                System.out.println(path.getFileName());
                try {
                    Files.delete(path);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            });
        }
    }
}

上面的示例程序是通過 PathMatcher 匹配 .tmp 結(jié)尾的臨時文件,然后進行刪除的示例,結(jié)合 PathMatcher 可以輕松的完成一個清理臨時文件的小程序。

讀文件內(nèi)容

上面的示例都是操作文件和目錄,這里介紹一下如何讀文件的內(nèi)容,為了方便演示讀取文件,先在 path/to/file.txt 相對目錄下創(chuàng)建一個示例文本:

Java is a high-level programming language.
Python is an interpreted, high-level programming language.
JavaScript is a scripting language for Web development.
C++ is a general-purpose programming language.
Rust is a systems programming language.

讀文件主要用到 Files 類的兩個方法:

  • readAllLines() 方法:一次性加載,主要用于讀取小到中等的文件
  • lines() 方法:逐行讀取,適用于大文件

小文件

readAllLines() 適用于讀取小到中等大小的文件,因為它會將整個文件內(nèi)容加載到內(nèi)存中,這個方法適用于在讀取文件內(nèi)容后立即處理整個文件的情況。使用示例:

public class LinesExample {
    public static void main(String[] args) throws IOException {
        // 讀取全部文件
        List<String> lines = Files.readAllLines(Paths.get("path/to/file.txt"), StandardCharsets.UTF_8);
        // 對文件內(nèi)容進行處理
        Map<String, Long> wordFrequency = lines.stream()
                .flatMap(line -> Arrays.stream(line.split("\\s+")))
                .map(String::toLowerCase)
                .collect(Collectors.groupingBy(word -> word, Collectors.counting()));
        System.out.println("Word Frequency:");
        wordFrequency.forEach((word, count) -> System.out.printf("%s: %d%n", word, count));
    }
}

大文件

lines() 方法: 使用場景:適用于讀取大型文件,因為它不會一次性將整個文件內(nèi)容加載到內(nèi)存中。通過使用 Java 8 的 Stream API,可以在讀取文件內(nèi)容時同時處理每一行,從而提高處理效率。使用示例:

public class LinesExample {

    public static void main(String[] args) throws IOException {
        Path filePath = Paths.get("path/to/file.txt");

        // 逐行讀取,并且在內(nèi)容進行處理
        Stream<String> lines = Files.lines(filePath);
        Map<String, Long> wordFrequency = lines
                .skip(3)            // 跳過前 3 行
                .flatMap(line -> Arrays.stream(line.split("\\s+")))
                .map(String::toLowerCase)
                .collect(Collectors.groupingBy(word -> word, Collectors.counting()));

        System.out.println("Word Frequency:");
        wordFrequency.forEach((word, count) -> System.out.printf("%s: %d%n", word, count));
        lines.close();
    }
}

輸出結(jié)果:

Word Frequency:
rust: 1
a: 2
c++: 1
systems: 1
language.: 2
is: 2
programming: 2
general-purpose: 1

總結(jié)

在過去,java.io 包主要負責處理文件 I/O。但是它存在一些問題,例如性能不佳、API 不直觀、文件元數(shù)據(jù)操作困難等。為了解決這些問題,后期的 Java 版本引入了新的 java.nio.file 庫。現(xiàn)在 java.nio.file 已經(jīng)成為處理文件 I/O 的首選庫。 Path、Files、FileSystem 等工具類,可以更方便快捷的訪問和操作文件系統(tǒng)。目前大多數(shù)的開發(fā)人員普遍認為 java.nio.file 比傳統(tǒng)的 java.io 包更直觀且易于使用。雖然 java.nio.file 庫已經(jīng)非常成熟,但是隨著操作系統(tǒng)和文件系統(tǒng)的發(fā)展,我們?nèi)匀豢梢云诖谖磥淼?Java 版本中看到它的一些擴展和改進。

到此這篇關(guān)于使用java.nio.file 庫優(yōu)雅的操作文件詳解的文章就介紹到這了,更多相關(guān)java.nio.file 庫操作文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java ArrayList的底層實現(xiàn)方法

    Java ArrayList的底層實現(xiàn)方法

    今天小編就為大家分享一篇Java ArrayList的底層實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • commons io文件操作示例分享

    commons io文件操作示例分享

    這篇文章主要介紹了commons io文件操作示例分享,需要的朋友可以參考下
    2014-02-02
  • Java重載構(gòu)造原理與用法詳解

    Java重載構(gòu)造原理與用法詳解

    這篇文章主要介紹了Java重載構(gòu)造原理與用法,結(jié)合實例形式分析了java可變參數(shù)、方法重載、構(gòu)造器等相關(guān)概念、原理及操作注意事項,需要的朋友可以參考下
    2020-02-02
  • SpringBoot Bean花式注解方法示例上篇

    SpringBoot Bean花式注解方法示例上篇

    這篇文章主要介紹了SpringBoot Bean花式注解方法,很多時候我們需要根據(jù)不同的條件在容器中加載不同的Bean,或者根據(jù)不同的條件來選擇是否在容器中加載某個Bean
    2023-02-02
  • Springcloud中的Nacos?Config服務配置流程分析

    Springcloud中的Nacos?Config服務配置流程分析

    這篇文章主要介紹了Springcloud中的Nacos?Config服務配置,本文以用戶微服務為例,進行統(tǒng)一的配置,結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • 在IntelliJ IDEA中為自己設(shè)計的類庫生成JavaDoc的方法示例

    在IntelliJ IDEA中為自己設(shè)計的類庫生成JavaDoc的方法示例

    這篇文章主要介紹了在IntelliJ IDEA中為自己設(shè)計的類庫生成JavaDoc的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Java數(shù)組轉(zhuǎn)換為集合的相關(guān)方法

    Java數(shù)組轉(zhuǎn)換為集合的相關(guān)方法

    在Java中我們經(jīng)常需要將數(shù)組從一種類型轉(zhuǎn)換為另一種類型,下面這篇文章主要給大家介紹了關(guān)于Java數(shù)組轉(zhuǎn)換為集合的相關(guān)方法,文中通過圖文及代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • 深入Java對象的地址的使用分析

    深入Java對象的地址的使用分析

    本篇文章介紹了,Java對象的地址的使用分析。需要的朋友參考下
    2013-05-05
  • java開發(fā)https請求ssl不受信任問題解決方法

    java開發(fā)https請求ssl不受信任問題解決方法

    這篇文章主要介紹了java開發(fā)https請求ssl不受信任問題解決方法,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • SpringBoot+MyBatis+AOP實現(xiàn)讀寫分離的示例代碼

    SpringBoot+MyBatis+AOP實現(xiàn)讀寫分離的示例代碼

    高并發(fā)這個階段,肯定是需要做MySQL讀寫分離的。本文主要介紹了SpringBoot+MyBatis+AOP實現(xiàn)讀寫分離的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評論