Java NIO 緩衝技術詳解

ImportNew發表於2015-09-24

緩衝區(buffer)是從即將寫入通道(channel)或剛剛從通道中讀出的一段資料。它是一個持有資料,並扮演NIO通道端點的物件。緩衝區為資料訪問和讀寫過程提供正式機制。

它是NIO和老版Java I/O的一個主要區別。之前資料是直接從流(stream)中讀寫的,現在資料可以從緩衝區讀寫。在NIO中,通道是流的同義詞。想要了解更多關於NIO通道的資訊, 請閱讀上一篇教程Java NIO通道

NIO緩衝區特徵

  • Java NIO的基本組成模組就是緩衝區。
  • 緩衝區提供一個固定大小的容器來讀取資料。
  • 每個緩衝區都是可讀的,但只有特定緩衝區才是可寫的。
  • 緩衝區是通道的端點。
  • 只讀緩衝區的內容是不可變的,但是其mark、position和limit都是可變的。
  • 預設情況下,緩衝區都不是執行緒安全的。

緩衝區型別

每種原始型別都有一個對應的緩衝區型別。所有的緩衝區類都實現了Buffer介面。最常用的緩衝區型別是ByteBuffer。如下是Java NIO包中提供的緩衝區型別。

  • ByteBuffer
  • CharBuffer
  • ShortBuffer
  • IntBuffer
  • LongBuffer
  • FloatBuffer
  • DoubleBuffer
  • MappedByteBuffer

緩衝區容量

緩衝區有固定大小,我們只能儲存少於“固定大小”的資料,固定大小的值就叫做緩衝區的容量。緩衝區一旦填滿則必須清空才能再次寫入。容量一旦設定好,在快取區的生命週期內都不會改變。

緩衝區界限

在寫入模式,緩衝區的界限就等於容量。在讀模式中,界限指向緩衝區最後一個資料位的下一位。當緩衝區被寫入時,界限一直遞增。緩衝區的界限永遠大於等於零且小於等於容量,0 <= 界限 <= 容量。

緩衝區位置

位置指向緩衝區當前地址。當緩衝區建立時,位置設定為零。讀寫過程中,位置會遞增到下一個索引位置。位置永遠在零和界限之間。

緩衝區標記

標記類似於給緩衝區設定書籤。呼叫 mark() 時當前位置就被記錄下來了,呼叫 reset() 時標記的位置就被恢復。

緩衝區flip、clear和rewind

緩衝區flip()

flip() 方法用來為緩衝區做準備,進行 get 操作或者準備新的寫入序列。flip() 將界限設定到當前位置,然後將位置置為0。

緩衝區clear()

clear() 方法用來為緩衝區做準備,進行 put 操作或者準備新的讀序列。clear() 將界限設定到容量的位置,並將位置置為0。

緩衝區rewind()

rewind() 方法用來再次讀取已經獲取過的資料。rewind()將緩衝區位置置0。

如何讀NIO緩衝區

  1. 首先建立緩衝區,分配容量。Buffer有一個 allocate(size) 方法,可以返回一個 Buffer 物件。ByteBuffer byteBuffer = ByteBuffer.allocate(512);
  2. 進行 flip 操作,準備進行讀操作。byteBuffer.flip();
  3. 下面可以讀入資料。int numberOfBytes = fileChannel.read(byteBuffer);
  4. 接下來可以從緩衝區讀取資料。char c = (char)byteBuffer.get();

如何寫NIO緩衝區

  1. 建立緩衝區,分配容量。ByteBuffer byteBuffer = ByteBuffer.allocate(512); //容量設為512
  2. 寫入資料。byteBuffer.put((byte) 0xff);

以上就是讀寫緩衝區的兩個例子。緩衝區有很多種型別以及很多種讀寫方法。你可以根據使用要求進行選擇。

相關文章