零、本講學習目標
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);
}
}
- 運行程序,查看結果
- 再次運行程序,查看結果