使用 Channel 和 Buffer 讀取檔案

Channel 使用 Buffer 來讀/寫資料。緩衝區是一個固定大小的容器,我們可以一次寫入一個資料塊。Channel 比基於流的 I / O 快得多。

要使用 Channel 從檔案中讀取資料,我們需要執行以下步驟 -

  1. 我們需要一個 FileInputStream 的例項。FileInputStream 有一個名為 getChannel() 的方法,它返回一個 Channel。
  2. 呼叫 FileInputStream 的 getChannel() 方法並獲取 Channel。
  3. 建立一個 ByteBuffer。ByteBuffer 是一個固定大小的位元組容器。
  4. Channel 有一個 read 方法,我們必須提供一個 ByteBuffer 作為這個 read 方法的引數。ByteBuffer 有兩種模式 - 只讀心情和只寫心情。我們可以使用 flip() 方法呼叫來改變模式。緩衝區具有位置,限制和容量。一旦建立了具有固定大小的緩衝區,其限制和容量與大小相同,並且位置從零開始。緩衝區寫入資料時,其位置逐漸增加。改變模式意味著改變位置。要從緩衝區的開頭讀取資料,我們必須將位置設定為零。flip() 方法改變位置
  5. 當我們呼叫 Channel 的 read 方法時,它會使用資料填充緩衝區。
  6. 如果我們需要從 ByteBuffer 讀取資料,我們需要翻轉緩衝區以將其模式更改為只讀模式,然後繼續從緩衝區讀取資料。
  7. 當不再有要讀取的資料時,通道的 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();
  }
 }
}