使用 Channel 和 Buffer 讀取檔案
Channel
使用 Buffer
來讀/寫資料。緩衝區是一個固定大小的容器,我們可以一次寫入一個資料塊。Channel
比基於流的 I / O 快得多。
要使用 Channel
從檔案中讀取資料,我們需要執行以下步驟 -
- 我們需要一個
FileInputStream
的例項。FileInputStream
有一個名為getChannel()
的方法,它返回一個 Channel。 - 呼叫 FileInputStream 的
getChannel()
方法並獲取 Channel。 - 建立一個 ByteBuffer。ByteBuffer 是一個固定大小的位元組容器。
- Channel 有一個 read 方法,我們必須提供一個 ByteBuffer 作為這個 read 方法的引數。ByteBuffer 有兩種模式 - 只讀心情和只寫心情。我們可以使用
flip()
方法呼叫來改變模式。緩衝區具有位置,限制和容量。一旦建立了具有固定大小的緩衝區,其限制和容量與大小相同,並且位置從零開始。緩衝區寫入資料時,其位置逐漸增加。改變模式意味著改變位置。要從緩衝區的開頭讀取資料,我們必須將位置設定為零。flip()
方法改變位置 - 當我們呼叫
Channel
的 read 方法時,它會使用資料填充緩衝區。 - 如果我們需要從
ByteBuffer
讀取資料,我們需要翻轉緩衝區以將其模式更改為只讀模式,然後繼續從緩衝區讀取資料。 - 當不再有要讀取的資料時,通道的
read()
方法返回 0 或 -1。
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class FileChannelRead {
public static void main(String[] args) {
File inputFile = new File("hello.txt");
if (!inputFile.exists()) {
System.out.println("The input file doesn't exit.");
return;
}
try {
FileInputStream fis = new FileInputStream(inputFile);
FileChannel fileChannel = fis.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (fileChannel.read(buffer) > 0) {
buffer.flip();
while (buffer.hasRemaining()) {
byte b = buffer.get();
System.out.print((char) b);
}
buffer.clear();
}
fileChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}