Java NIO緩沖

jopen 9年前發布 | 10K 次閱讀 NIO Java開發

緩沖區(buffer)是從即將寫入通道(channel)或剛剛從通道中讀出的一段數據。它是一個持有數據,并扮演NIO通道端點的對象。緩沖區為數據訪問和讀寫過程提供正式機制。

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

NIO緩沖區特征

  • Java NIO的基本組成模塊就是緩沖區。
  • 緩沖區提供一個固定大小的容器來讀取數據。
  • 每個緩沖區都是可讀的,但只有特定緩沖區才是可寫的。
  • 緩沖區是通道的端點。
  • 只讀緩沖區的內容是不可變的,但是其mark、position和limit都是可變的。
  • 默認情況下,緩沖區都不是線程安全的。
  • </ul>

    緩沖區類型

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

    • ByteBuffer
    • CharBuffer
    • ShortBuffer
    • IntBuffer
    • LongBuffer
    • FloatBuffer
    • DoubleBuffer
    • MappedByteBuffer
    • </ul>

      緩沖區容量

      緩沖區有固定大小,我們只能存儲少于“固定大小”的數據,固定大小的值就叫做緩沖區的容量。緩沖區一旦填滿則必須清空才能再次寫入。容量一旦設置好,在緩存區的生命周期內都不會改變。

      緩沖區界限

      在寫入模式,緩沖區的界限就等于容量。在讀模式中,界限指向緩沖區最后一個數據位的下一位。當緩沖區被寫入時,界限一直遞增。緩沖區的界限永遠大于等于零且小于等于容量,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();
      5. </ol>

        如何寫NIO緩沖區

        1. 創建緩沖區,分配容量。ByteBuffer byteBuffer = ByteBuffer.allocate(512); //容量設為512
        2. 寫入數據。byteBuffer.put((byte) 0xff);
        3. </ol>

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

          原文鏈接: javapapers 翻譯: ImportNew.com - lemeilleur
          譯文鏈接: http://www.importnew.com/16721.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!