新聞中心
創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!
這篇文章主要介紹關于JAVA中NIO緩沖區(qū)簡介,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
當我們需要與 NIO Channel 進行交互時, 我們就需要使用到 NIO Buffer, 即數(shù)據(jù)從 Buffer讀取到 Channel 中, 并且從 Channel 中寫入到 Buffer 中。緩沖區(qū)本質(zhì)上是一塊可以寫入數(shù)據(jù),然后可以從中讀取數(shù)據(jù)的內(nèi)存。這塊內(nèi)存被包裝成NIO Buffer對象,并提供了一組方法,用來方便的訪問該塊內(nèi)存。
緩沖區(qū)基礎
Buffer 類型有:
緩沖區(qū)是包在一個對象內(nèi)的基礎數(shù)據(jù)的數(shù)組,Buffer類相比一般簡單數(shù)組而言其優(yōu)點是將數(shù)據(jù)的內(nèi)容和相關信息放在一個對象里面,這個對象提供了處理緩沖區(qū)數(shù)據(jù)的豐富的API。
所有緩沖區(qū)都有4個屬性:capacity、limit、position、mark,并遵循:capacity>=limit>=position>=mark>=0,下面是對這4個屬性的解釋:
- Capacity: 容量,即可以容納的大數(shù)據(jù)量;在緩沖區(qū)創(chuàng)建時被設定并且不能改變
- Limit: 上界,緩沖區(qū)中當前數(shù)據(jù)量
- Position: 位置,下一個要被讀或?qū)懙脑氐乃饕?/li>
- Mark: 標記,調(diào)用mark()來設置mark=position,再調(diào)用reset()可以讓position恢復到標記的位置即position=mark
我們通過一個簡單的操作流程來說明buffer的使用,下圖是新創(chuàng)建的容量為10的緩沖區(qū)邏輯視圖:
然后進行5次調(diào)用put:
buffer.put((byte)'A').put((byte)'B').put((byte)'C').put((byte)'D').put((byte)'E')
5次調(diào)用put之后的緩沖區(qū)為:
現(xiàn)在緩沖區(qū)滿了,我們必須將其清空。我們想把這個緩沖區(qū)傳遞給一個通道,以使內(nèi)容能被全部寫出,但現(xiàn)在執(zhí)行g(shù)et()無疑會取出未定義的數(shù)據(jù)。我們必須將 posistion設為0,然后通道就會從正確的位置開始讀了,但讀到哪算讀完了呢?這正是limit引入的原因,它指明緩沖區(qū)有效內(nèi)容的未端。這個操作 在緩沖區(qū)中叫做翻轉(zhuǎn):buffer.flip()。
Buffer的基本用法
使用Buffer讀寫數(shù)據(jù)一般遵循以下四個步驟:
- 寫入數(shù)據(jù)到Buffer
- 調(diào)用flip()方法
- 從Buffer中讀取數(shù)據(jù)
- 調(diào)用clear()方法或者compact()方法
當向buffer寫入數(shù)據(jù)時,buffer會記錄下寫了多少數(shù)據(jù)。
一旦要讀取數(shù)據(jù),需要通過flip()方法將Buffer從寫模式切換到讀模式。在讀模式下,可以讀取之前寫入到buffer的所有數(shù)據(jù)。
一旦讀完了所有的數(shù)據(jù),就需要清空緩沖區(qū),讓它可以再次被寫入。有兩種方式能清空緩沖區(qū):調(diào)用clear()或compact()方法。clear()方法會清空整個緩沖區(qū)。compact()方法只會清除已經(jīng)讀過的數(shù)據(jù)。任何未讀的數(shù)據(jù)都被移到緩沖區(qū)的起始處,新寫入的數(shù)據(jù)將放到緩沖區(qū)未讀數(shù)據(jù)的后面。
下面我們看一段程序來看一下Buffer的基本用法:
public static void readFile(String fileName) { RandomAccessFile aFile = null; try { //文件流 aFile = new RandomAccessFile(fileName, "rw"); //將文件輸入到管道 FileChannel inChannel = aFile.getChannel(); //為buffer分配1024個字節(jié)大小的空間 ByteBuffer buf = ByteBuffer.allocate(1024); //將buffer中的內(nèi)容讀取到管道中 int bytesRead = inChannel.read(buf); while (bytesRead != -1) { //反轉(zhuǎn)buffer,將寫模式改為讀模式 buf.flip(); while (buf.hasRemaining()) { //獲取buffer中的數(shù)據(jù) System.out.print((char) buf.get()); } //將上次分配的1024字節(jié)的內(nèi)容清空,為下次接收做準備 buf.clear(); //管道重新讀取buffer中的內(nèi)容 bytesRead = inChannel.read(buf); } aFile.close(); } catch (Exception e) { e.printStackTrace(); } }
網(wǎng)頁名稱:關于JAVA中NIO緩沖區(qū)簡介-創(chuàng)新互聯(lián)
本文來源:http://www.dlmjj.cn/article/dpcchj.html