文章目錄
- 一、簡介
- 二、使用
- (1) `Buffer` 配置設定
- (2) 向`Buffer` 寫資料
- (3) `flip()` 方法
- (4) 從`Buffer`讀取資料
- (5) `clear()`與`compact()`
- 三、參考資料
一、簡介
一個
Buffer
對象是固定數量的資料的容器
其屬性有:
- 容量(Capacity): 緩沖區能夠容納的資料元素的最大數量
- 上界(Limit): 緩沖區的第一個不能被讀或寫的元素, 用于計數
- 位置(Position): 下一個要被讀或寫的元素的索引
- 标記(Mark): 一個備忘位置
讀寫模式下, capacity、limit、position
二、使用
使用
Buffer
讀寫資料基本步驟:
- 寫入資料到
Buffer
- 調用
方法flip()
- 從
中讀取資料Buffer
- 調用
方法或者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
配置設定
Buffer
ByteBuffer buf = ByteBuffer.allocate(1024);
(2) 向 Buffer
寫資料
Buffer
- 從
向Channel
寫Buffer
int bytesRead = inChannel.read(buf);
- 通過
put()
buf.put(1);
(3) flip()
方法
flip()
将 Buffer
從寫模式切換到讀模式
即将
position
設定為0, 并将
limit
設定成之前的
position
(4) 從 Buffer
讀取資料
Buffer
有兩種方式:
- 從
讀取資料到Buffer
Channel
int bytesWritten = inChannel.write(buf);
- 使用
方法從get()
中讀取資料Buffer
byte by = buf.get();
(5) clear()
與 compact()
clear()
compact()
一旦讀完
Buffer
中的資料,需要讓
Buffer
準備好再次被寫入。可以通過
clear()
或
compact()
方法來完成。
如果調用的是
clear()
方法,
position
将被設回0,
limit
被設定成
capacity
的值。換句話說,
Buffer
被清空了。
Buffer
中的資料并未清除,隻是這些标記告訴我們可以從哪裡開始往Buffer裡寫資料。
- 如果
中有一些未讀的資料,調用Buffer
方法,資料将“被遺忘”,意味着不再有任何标記會告訴你哪些資料被讀過,哪些還沒有。clear()
- 如果
中仍有未讀的資料,且後續還需要這些資料,但是此時想要先先寫些資料,那麼使用Buffer
方法。compact()
-
方法将所有未讀的資料拷貝到compact()
起始處。然後将Buffer
設到最後一個未讀元素正後面。position
屬性依然像limit
方法一樣,設定成clear()
。現在capacity
準備好寫資料了,但是不會覆寫未讀的資料。Buffer
三、參考資料
- http://ifeve.com/buffers/
- << Java NIO >>