Java講課筆記28:Path接口和Files工具類

零、本講學習目標

1、熟悉Path接口的基本使用

2、掌握Files工具類的基本使用

一、NIO概述(選講)

(一)NIO定義

從JDK 1.4開始,Java提供了一系列改進的用於處理輸入/輸出的新功能,這些新功能被稱之爲NIO(New I/O)。

  • NIO採用內存映射文件的方式來處理輸入/輸出,它將文件或文件的一段區域映射到內存中,這樣就可以像訪問內存一樣來訪問文件了。
  • 在NIO中,使用的是Channel(通道)和Buffer(緩衝器)。
  • 數據總是從通道讀入緩衝器,或從緩衝器寫入通道。

(二)NIO相關包

  • java.nio:主要包含各種與Buffer相關的類。
  • java.nio.channels:主要包含與Channel和Selector(多線程相關選擇器)相關的類。
  • java.nio.channels.spi:主要包含與Channel相關的服務提供者編程接口。
  • java.nio.charset:主要包含與字符集相關的類。
  • java.nio.charset.spi:主要包含與字符集相關的服務提供者編程接口。

(三)NIO三大核心

1、Buffer

Buffer本質是一個數組緩衝區,讀入或寫出到Channel中的所有對象都會先放在Buffer中。

2、Channel

Channel是對傳統的輸入/輸出的模擬,在NIO中,所有的數據都需要通過通道流的形式傳輸。

3、Selector

Selector用於監聽多個通道的事件(例如:連接打開、數據到達等),主要用於多線程處理。

(四)案例演示

1、演示字節緩衝區ByteBuffer的用法

  • 字節緩衝區ByteBuffer繼承關係圖
    在這裏插入圖片描述

  • 字節緩衝區的重要屬性
    1)capacity(容量):緩衝區容量,單位是字節(capacity>=0)
    2)limit(限制):緩衝區限制(限定獲取元素的最大下標,limit<=capacity)
    3)position(位置):緩衝區位置(position<limit)

  • 字節緩衝區的重要方法
    1)allocate(int capacity):分配緩衝區容量
    2)limit():獲取緩衝區限制
    3)limit(int newLimit):設置緩衝區限制
    4)position():獲取緩衝區位置
    5)position(int newPosition):設置緩衝區位置
    6)get():從緩衝區position指定的位置獲取一個元素,然後position增加1。
    7)put(byte b):往緩衝區寫入數據(字節數據),導致position變化
    8)putXXX(XXX x):往緩衝區寫入數據(XXX類型數據),導致position變化

  • 創建Example2801
    在這裏插入圖片描述

2、演示文件通道FileChannel的用法

  • 文件通道FileChannel概述
    在這裏插入圖片描述
    (1)FileChannel是用於讀取、寫入、映射和操作文件的通道。 文件通道在其文件中有一個當前position,可對其進行查詢和修改。該文件本身包含一個可讀寫的長度可變的字節序列,並且可以查詢該文件的當前大小。寫入的字節超出文件的當前大小時,則增加文件的大小;截取該文件時,則減小文件的大小。文件可能還有某個相關聯的元數據,如訪問權限、內容類型和最後修改時間;此類未定義訪問元數據的方法。
    (2)FileChannel不能單獨創建,只能基於某一個流來創建。基於輸入流創建的文件通道只能進行讀操作,基於輸出流創建的文件通道只能進行寫操作。

  • 創建Example2802
    在這裏插入圖片描述

二、NIO.2概述

(一)NIO.2定義與特點

JDK 7引入了新的I/O API,對原有I/O API中的功能進行改進,這個改進之後的NIO就稱之爲NIO.2。

  • 提供了全面的文件輸入/輸出以及文件系統的訪問與支持
  • 新增了java.nio.file包及其子包
  • 還提供基於異步Channel的輸入/輸出

(二)NIO.2提供的接口與工具類

通過前面的學習,我們知道,File雖然可以訪問文件系統,但是File類所提供的方法性能較低,大多數方法在出錯時僅返回失敗而不提供異常信息,不僅如此, File類還不能利用特定的文件系統的特性。爲了彌補這種不足,NIO.2提供了一個Path接口,該接口是一共用在文件系統中定位文件的對象,通常表示一個依賴於系統的文件路徑。除此之外,NIO.2還提供了Paths和Files兩個工具類,其中Paths類中提供了兩個返回Path的靜態方法,通過這兩個方法可以創建Path對象,而Files類中提供了大量的靜態方法來操作文件。

三、Path接口

(一)Path接口定義

Path接口是一個共用在文件系統中定位文件的對象,通常表示一個依賴於系統的文件路徑。NIO.2還提供了Paths和Files兩個工具類,其中Paths類中提供了兩個返回Path的靜態方法,通過這兩個方法可以創建Path對象。

(二)Path接口常用方法

方法聲明 功能描述
boolean endsWith(String other) 判斷當前路徑是否以指定的字符串結尾
Path getName(int index) 返回此路徑的名稱元素作爲路徑對象
int getNameCount() 返回路徑中名稱元素的數量
Path getParent() 返回父路徑,如果此路徑沒有父路徑,則返回null
Path getRoot() 返回該路徑的根組件作爲路徑對象,如果此路徑沒有根組件,則返回null
Path toAbsolutePath() 返回表示此路徑的絕對路徑的路徑對象
URI toUri() 返回表示此路徑的URI地址

(三)案例演示:演示Path接口的用法

  • 創建Example2803
    在這裏插入圖片描述
package net.hw.lesson28;

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

/**
 * 功能:演示Path接口用法
 * 作者:華衛
 * 日期:2020年05月29日
 */
public class Example2803 {
    public static void main(String[] args) {
        // 利用Paths類獲取路徑對象
        Path path = Paths.get("d:/IdeaProjects/JavaDemo2020/src/net/hw/lesson28/Example2801.java");
        // 輸出路徑對象的信息
        System.out.println("path的根路徑:" + path.getRoot());
        System.out.println("path的父路徑:" + path.getParent());
        System.out.println("path的路徑名稱數:" + path.getNameCount());
        // 通過循環輸出路徑名稱
        for (int i = 0; i < path.getNameCount(); i++) {
            System.out.println("path[" + i + "] = " + path.getName(i));
        }
        System.out.println("path的文件名:" + path.getFileName());
        System.out.println("path的文件系統:" + path.getFileSystem());
        System.out.println("path的URI路徑:" + path.toUri());
        System.out.println("path的絕對路徑:" + path.toAbsolutePath());
    }
}
  • 運行程序,查看結果
    在這裏插入圖片描述
  • 說明:首先使用Paths類的get()方法獲取Path對象,然後分別使用Path對象中的各種方法來輸出對象中的各種路徑信息。

四、Files工具類

(一)Files工具類概述

NIO.2針對文件操作除了Paths工具類與Path接口外,還提供了一個Files工具類,該類是一個操作文件的工具類,包含了大量的方法供用戶選用。

(二)Files工具類常用方法

方法聲明 功能描述
static Path createDirectories(Path dir, FileAttribute<?>… attrs) 創建多級文件目錄
static Path createFile(Path path, FileAttribute<?>… attrs) 創建一個新的空文件,如果文件已經存在,則創建失敗
static Path copy(Path source, Path target,CopyOption… options) 該方法將一個文件複製到目標文件,並使用選項參數指定如何執行復制
static List<String> readAllLines(Path path) 從文件中讀取所有行
static long size(Path path) 返回文件的大小(以字節爲單位)
static Stream<Path> list(Path dir) 將指定路徑轉換爲Stream流對象
static Path write(Path path, Iterable<? extends CharSequence> lines, OpenOption… options) 將文本行寫入文件,並傳入指定的寫入模式

(三)案例演示:演示Files工具類的用法

  • 創建Example2804
    在這裏插入圖片描述
package net.hw.lesson28;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.List;

/**
 * 功能:演示Files工具類的用法
 * 作者:華衛
 * 日期:2020年05月29日
 */
public class Example2804 {
    public static void main(String[] args) throws IOException {
        // 利用Paths類創建一個目錄的路徑對象
        Path dirPath = Paths.get("D:/test/lzy/ied");

        // 根據路徑對象創建多級目錄(注意:File對象的mkdir()只能逐級創建目錄)
        Files.createDirectories(dirPath);
        // 提示用戶目錄創建成功
        System.out.println("恭喜,目錄[" + dirPath + "]創建成功!");

        // 利用Paths類創建一個文件的路徑對象
        Path filePath = Paths.get("D:/test/lzy/ied/freedom.txt");
        // 根據路徑對象創建文件
        Files.createFile(filePath);
        // 提示用戶文件創建成功
        System.out.println("恭喜,文件[" + filePath + "]創建成功!");

        // 創建List集合,並添加內容
        List<String> list = new ArrayList<>();
        list.add("生命誠可貴");
        list.add("愛情價更高");
        list.add("若爲自由故");
        list.add("兩者皆可拋");
        // 將集合內容寫入指定文件
        Files.write(filePath, list, StandardOpenOption.APPEND);

        // 讀取文件全部行
        List<String> lines = Files.readAllLines(filePath);
        System.out.println("文件大小:" + Files.size(filePath));
        System.out.println("文件行數:" + lines.size());
        System.out.println("文件內容:" + lines);
    }
}
  • 運行程序,查看結果
    在這裏插入圖片描述
  • 再次運行程序,查看結果
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章