Java NIO学习笔记之图解ByteBuffer
轉載自?Java NIO學習筆記之圖解ByteBuffer
ByteBuffer前前后后看過好幾次了,實際使用也用了一些,總覺得條理不夠清晰。
《程序員的思維修煉》一本書講過,主動學習,要比單純看資料效果來的好,所以干脆寫個詳細點的文章來記錄一下。
概述
ByteBuffer是NIO里用得最多的Buffer,它包含兩個實現方式:HeapByteBuffer是基于Java堆的實現,而DirectByteBuffer則使用了unsafe的API進行了堆外的實現。這里只說HeapByteBuffer。
使用
ByteBuffer最核心的方法是put(byte)和get()。分別是往ByteBuffer里寫一個字節,和讀一個字節。
值得注意的是,ByteBuffer的讀寫模式是分開的,正常的應用場景是:往ByteBuffer里寫一些數據,然后flip(),然后再讀出來。
這里插兩個Channel方面的對象,以便更好的理解Buffer。
ReadableByteChannel是一個從Channel中讀取數據,并保存到ByteBuffer的接口,它包含一個方法:
| 1 2 | <!-- lang: java --> public int read(ByteBuffer dst) throws IOException; |
WritableByteChannel則是從ByteBuffer中讀取數據,并輸出到Channel的接口:
| 1 2 | <!-- lang: java --> public int write(ByteBuffer src) throws IOException; |
那么,一個ByteBuffer的使用過程是這樣的:
| 1 2 3 4 5 6 7 8 | <!-- lang: java --> byteBuffer = ByteBuffer.allocate(N); //讀取數據,寫入byteBuffer readableByteChannel.read(byteBuffer); //變讀為寫 byteBuffer.flip(); //讀取byteBuffer,寫入數據 writableByteChannel.write(byteBuffer); |
看到這里,一般都不太明白flip()干了什么事,先從ByteBuffer結構說起:
ByteBuffer內部字段
byte[] buff
buff即內部用于緩存的數組。
position
當前讀取的位置。
mark
為某一讀過的位置做標記,便于某些時候回退到該位置。
capacity
初始化時候的容量。
limit
讀寫的上限,limit<=capacity。
圖解
put
寫模式下,往buffer里寫一個字節,并把postion移動一位。寫模式下,一般limit與capacity相等。
flip
寫完數據,需要開始讀的時候,將postion復位到0,并將limit設為當前postion。?
get
從buffer里讀一個字節,并把postion移動一位。上限是limit,即寫入數據的最后位置。
clear
將position置為0,并不清除buffer內容。
mark相關的方法主要是mark()(標記)和reset()(回到標記)。
總結
以上是生活随笔為你收集整理的Java NIO学习笔记之图解ByteBuffer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 县城,新茶饮的“绞肉机”
- 下一篇: Java 非阻塞 IO 和异步 IO