Java NIO 包介紹
本教程介紹 Java NIO
包。我們已經有了一個用於執行讀/寫操作的 java.io
包,但是 java.nio
允許我們使用其他特性和功能以不同的方式工作。
如何?讓我們深入瞭解它的細節。
Java NIO
包簡介
Java New Input/Output (NIO
) 是一種高效能的檔案處理結構和網路 API。java.nio
包包含所有 NIO
類;它不會替換 java.io
包中基於流的輸入/輸出 (IO
) 類。
Java NIO
是從 JDK 4
版本引入的,作為 java.io
的替代品,具有一些額外的特性和功能,與標準輸入/輸出 (IO
) 不同的是 IO
)。
我們已經知道 java.io
包具有我們可用於 Java I/O 操作的所有必要類,而 java.nio
引入了可在整個 Java NIO
API 中使用的 buffer
類.
你可能有一個問題:當我們已經有了一個包 java.io
時,為什麼要引入一個名為 java.nio
的新包?
使用 Java NIO
包的主要原因
我們更喜歡使用 java.nio
包有兩個原因。
java.nio
包使用面向緩衝區的方法,讓我們在緩衝區中來回移動。它使用一塊記憶體(也稱為緩衝區)來讀取和快取資料,可以在需要時從緩衝區中快速訪問;我們也可以將資料寫入緩衝區。java.nio
包可以執行非阻塞輸入/輸出 (IO
) 操作。在這裡,非阻塞意味著它可以讀取它發現準備好的資料/資訊。
例如,我們有一個執行緒要求通道從緩衝區中讀取資料/資訊;該執行緒在該時間範圍內進行其他操作,並在離開工作的地方再次繼續。同時,完成讀取過程,提升整體效能。
NIO
和 IO
之間的主要區別在於 NIO
是非阻塞的,而 IO
是阻塞的。
當我們正在尋找面向緩衝區的方法和高速輸入/輸出操作時,我們可以優先使用 Java NIO
而不是 IO
包。
NIO
包,你必須瞭解 Java IO
包。Java NIO
包的主要元件
它具有以下主要元件才能正常工作。
Buffer
- 由於java.nio
包是面向緩衝區的,它具有用於原始資料型別的緩衝區。緩衝區用作容器,我們可以在其中從緩衝區讀取資料/向緩衝區讀取資料,以便使用通道進行進一步處理。Channel
-java.nio
的頻道類類似於用於雙向通訊的流(IO
流)。通過使用通道,我們可以進行非阻塞的輸入/輸出操作;我們還可以從通道讀取/寫入資料到緩衝區。
通道用作閘道器,其中與各種實體的連線由可以執行非阻塞 IO
操作的通道描述。
Selector
- 我們可以使用選擇器來完成非阻塞IO
操作。選擇器(一個物件)監視多個通道的事件。
我們可以說選擇器選擇準備執行輸入/輸出操作的通道。
在 Java 中使用 NIO
包讀取和寫入檔案
以下是可用於執行不同操作的各種類的圖形表示。
你可以在此處詳細瞭解 java.nio
,但我們在本教程中專注於從檔案讀取和寫入與檔案相關的操作;請參閱以下示例。
示例程式碼(用於從檔案中讀取):
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class readFromFile {
public static void main(String[] args) {
Path filePath = Paths.get("file.txt");
Charset charSet = Charset.forName("ISO-8859-1");
try {
List<String> lines = Files.readAllLines(filePath, charSet);
for (String line : lines) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println(e);
}
}
}
示例程式碼(用於寫入檔案):
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class writeToFile {
public static void main(String[] args) {
Path filePath = Paths.get("file.txt");
String message = "We have overwritten the file";
Charset charSet = Charset.forName("ISO-8859-1");
try {
Files.write(filePath, message.getBytes());
List<String> lines = Files.readAllLines(filePath, charSet);
for (String line : lines) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println(e);
}
}
}
輸出(從檔案讀取並寫入檔案):
我們從指定檔案中讀取資料並在第一個程式碼片段的命令列中列印出來。在第二個程式碼示例中,我們將資料(一個小字串)寫入給定檔案並將其列印在螢幕上以告知檔案中寫入的內容。
在第一個示例程式碼中,我們將 Paths.get()
方法稱為 Path
例項的工廠方法。簡單來說,我們可以說,每當我們呼叫 java.nio.file.Paths
類的名為 get()
的靜態方法時,它都會建立一個 Path
例項。
此方法採用字串序列(這些字串將被連線以形成路徑)或字串作為引數,並將其轉換為 Path
例項。如果我們傳遞的字串中有任何非法字元,它會丟擲 InvalidPathException
。
與 File
一樣,java.nio.file.Path
可能指的是檔案系統中的相對路徑或絕對路徑。
Charset
用於字元編碼。我們使用 ISO-8859-1
字元編碼,但你可以指定 UTF-8
或任何其他你想使用的編碼。
readAllLines()
方法逐行讀取文字檔案。我們將讀取的資料儲存到 String
的 List
中(參見程式碼)。
此外,我們使用 for
迴圈在螢幕上顯示所有讀取的行。
在第二個程式碼示例中,除了這行程式碼之外,所有邏輯都是相同的。
Files.write(filePath, message.getBytes());
File.write()
是 Java NIO
包的靜態方法,用於寫入指定檔案。