ByteBuffer中的flip()、clear()、compact()
public static void main(String[] args) { try (FileChannel channel = new FileInputStream("data.txt").getChannel()){ // 定義緩沖區(qū) allocate分配大小 ByteBuffer buffer = ByteBuffer.allocate(10); while(true) { // 去讀緩沖區(qū)內(nèi)容 int read = channel.read(buffer); if(read != -1){ // 切換為讀模式 buffer.flip(); while (buffer.hasRemaining()) { System.out.println((char)buffer.get()); } // 切換為寫模式 // buffer.clear(); buffer.compact(); } else { break; } } } catch (Exception e) { e.printStackTrace(); } }
在讀取文件流時(shí),正確姿勢為:
- 向buffer寫數(shù)據(jù),如channel.read(buffer),此時(shí)默認(rèn)為寫模式
- 調(diào)用flip()切換為讀模式
- 從buffer讀取數(shù)據(jù),如buffer.get()
- 調(diào)用clear()或compact()切換為寫模式
- 重復(fù)以上步驟
為什么需要頻繁切換讀寫模式呢?這里簡單介紹一下flip(),clear(),compact()三者到底做了什么事。
1、ByteBuffer的內(nèi)部結(jié)構(gòu)
首先介紹三個(gè)屬性:
capacity:bytebuffer容量大小
position:位移指針位置
limit:指針位移限制

ByteBuffer buffer = ByteBuffer.allocate(10)分配得到的初始空間大小為:
capacity:10字節(jié)
position:0
limit:為capacity的位置
當(dāng)有數(shù)據(jù)寫入時(shí)候,每寫入一個(gè)字節(jié),position往后移動(dòng)一個(gè)字節(jié)位置,直到limit位置,該緩沖區(qū)滿。

2、flip()方法
如需要讀取緩沖區(qū)數(shù)據(jù),使用flip()切換為讀數(shù)據(jù)模式,此時(shí)position和limit指針位置發(fā)生變化。

position移動(dòng)到最開始位置,limit移動(dòng)到數(shù)據(jù)長度的末尾。每讀取一個(gè)字節(jié),position向后移動(dòng)一個(gè)字節(jié)位置。直到limit位置處停止。
3、clear()方法
調(diào)用clear()方法,position和limit指針位置發(fā)生變化。

clear默認(rèn)清空緩沖區(qū),回到最開始分配的樣子,即position=0,limit=capacity。
4、compact()方法
compact也可以切換為寫模式,不過是把未讀完成的數(shù)據(jù)向前壓縮,然后再切換。

compact也會(huì)改變position和limit指針位置,但position != 0,而是等于上次讀取末尾的位置,limit=capacity位置。
轉(zhuǎn)發(fā):https://blog.csdn.net/p793049488/article/details/122523894

浙公網(wǎng)安備 33010602011771號