天天看點

【Java NIO】之 Buffer

文章目錄

  • ​​一、簡介​​
  • ​​二、使用​​
  • ​​(1) `Buffer` 配置設定​​
  • ​​(2) 向`Buffer` 寫資料​​
  • ​​(3) `flip()` 方法​​
  • ​​(4) 從`Buffer`讀取資料​​
  • ​​(5) `clear()`與`compact()`​​
  • ​​三、參考資料​​

一、簡介

一個​

​Buffer​

​對象是固定數量的資料的容器

其屬性有:

  1. 容量(Capacity): 緩沖區能夠容納的資料元素的最大數量
  2. 上界(Limit): 緩沖區的第一個不能被讀或寫的元素, 用于計數
  3. 位置(Position): 下一個要被讀或寫的元素的索引
  4. 标記(Mark): 一個備忘位置

讀寫模式下, capacity、limit、position

二、使用

使用​

​Buffer​

​讀寫資料基本步驟:

  1. 寫入資料到​

    ​Buffer​

  2. 調用​

    ​flip()​

    ​ 方法
  3. 從​

    ​Buffer​

    ​中讀取資料
  4. 調用​

    ​clear()​

    ​​方法或者​

    ​compact()​

    ​方法
ByteBuffer buf = ByteBuffer.allocate(1024);

int bytesRead = inChannel.read(buf);

while(bytesRead != -1) {
    buf.flip();
    
    while(buf.hasRemaining()) {
        System.out.println((char) buf.get());
    }
    
    buf.clear();
    bytesRead = inChannel.read(buf);
}      

(1) ​

​Buffer​

​ 配置設定

ByteBuffer buf = ByteBuffer.allocate(1024);      

(2) 向​

​Buffer​

​ 寫資料

  1. 從​

    ​Channel​

    ​​向​

    ​Buffer​

    ​寫
int bytesRead = inChannel.read(buf);      
  1. 通過​

    ​put()​

buf.put(1);      

(3) ​

​flip()​

​ 方法

将​

​Buffer​

​從寫模式切換到讀模式

即将​

​position​

​​設定為0, 并将​

​limit​

​​設定成之前的​

​position​

(4) 從​

​Buffer​

​讀取資料

有兩種方式:

  1. 從​

    ​Buffer​

    ​​讀取資料到​

    ​Channel​

int bytesWritten = inChannel.write(buf);      
  1. 使用​

    ​get()​

    ​​方法從​

    ​Buffer​

    ​中讀取資料
byte by = buf.get();      

(5) ​

​clear()​

​​與​

​compact()​

一旦讀完​

​Buffer​

​​中的資料,需要讓​

​Buffer​

​​準備好再次被寫入。可以通過​

​clear()​

​​或​

​compact()​

​方法來完成。

如果調用的是​

​clear()​

​​方法,​

​position​

​​将被設回0,​

​limit​

​​被設定成 ​

​capacity​

​​的值。換句話說,​

​Buffer​

​​ 被清空了。​

​Buffer​

​中的資料并未清除,隻是這些标記告訴我們可以從哪裡開始往Buffer裡寫資料。

  1. 如果​

    ​Buffer​

    ​中有一些未讀的資料,調用​

    ​clear()​

    ​方法,資料将“被遺忘”,意味着不再有任何标記會告訴你哪些資料被讀過,哪些還沒有。
  2. 如果​

    ​Buffer​

    ​中仍有未讀的資料,且後續還需要這些資料,但是此時想要先先寫些資料,那麼使用​

    ​compact()​

    ​方法。
  3. ​compact()​

    ​​方法将所有未讀的資料拷貝到​

    ​Buffer​

    ​起始處。然後将​

    ​position​

    ​設到最後一個未讀元素正後面。​

    ​limit​

    ​屬性依然像​

    ​clear()​

    ​方法一樣,設定成​

    ​capacity​

    ​。現在​

    ​Buffer​

    ​準備好寫資料了,但是不會覆寫未讀的資料。

三、參考資料

  1. ​​http://ifeve.com/buffers/​​
  2. << Java NIO >>