Java NIO 緩沖技術(shù)詳解
緩沖區(qū)(buffer)是從即將寫入通道(channel)或剛剛從通道中讀出的一段數(shù)據(jù)。它是一個持有數(shù)據(jù),并扮演NIO通道端點的對象。緩沖區(qū)為數(shù)據(jù)訪問和讀寫過程提供正式機制。
它是NIO和老版Java I/O的一個主要區(qū)別。之前數(shù)據(jù)是直接從流(stream)中讀寫的,現(xiàn)在數(shù)據(jù)可以從緩沖區(qū)讀寫。在NIO中,通道是流的同義詞。想要了解更多關(guān)于NIO通道的信息, 請閱讀上一篇教程Java NIO通道。
NIO緩沖區(qū)特征
- Java NIO的基本組成模塊就是緩沖區(qū)。
- 緩沖區(qū)提供一個固定大小的容器來讀取數(shù)據(jù)。
- 每個緩沖區(qū)都是可讀的,但只有特定緩沖區(qū)才是可寫的。
- 緩沖區(qū)是通道的端點。
- 只讀緩沖區(qū)的內(nèi)容是不可變的,但是其mark、position和limit都是可變的。
- 默認情況下,緩沖區(qū)都不是線程安全的。
緩沖區(qū)類型
每種原始類型都有一個對應(yīng)的緩沖區(qū)類型。所有的緩沖區(qū)類都實現(xiàn)了Buffer接口。最常用的緩沖區(qū)類型是ByteBuffer。如下是Java NIO包中提供的緩沖區(qū)類型。
- ByteBuffer
- CharBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
- MappedByteBuffer
緩沖區(qū)容量
緩沖區(qū)有固定大小,我們只能存儲少于“固定大小”的數(shù)據(jù),固定大小的值就叫做緩沖區(qū)的容量。緩沖區(qū)一旦填滿則必須清空才能再次寫入。容量一旦設(shè)置好,在緩存區(qū)的生命周期內(nèi)都不會改變。
緩沖區(qū)界限
在寫入模式,緩沖區(qū)的界限就等于容量。在讀模式中,界限指向緩沖區(qū)***一個數(shù)據(jù)位的下一位。當(dāng)緩沖區(qū)被寫入時,界限一直遞增。緩沖區(qū)的界限永遠大于等于零且小于等于容量,0 <= 界限 <= 容量。
緩沖區(qū)位置
位置指向緩沖區(qū)當(dāng)前地址。當(dāng)緩沖區(qū)創(chuàng)建時,位置設(shè)置為零。讀寫過程中,位置會遞增到下一個索引位置。位置永遠在零和界限之間。
緩沖區(qū)標(biāo)記
標(biāo)記類似于給緩沖區(qū)設(shè)置書簽。調(diào)用 mark() 時當(dāng)前位置就被記錄下來了,調(diào)用 reset() 時標(biāo)記的位置就被恢復(fù)。
緩沖區(qū)flip、clear和rewind
緩沖區(qū)flip()
flip() 方法用來為緩沖區(qū)做準(zhǔn)備,進行 get 操作或者準(zhǔn)備新的寫入序列。flip() 將界限設(shè)置到當(dāng)前位置,然后將位置置為0。
緩沖區(qū)clear()
clear() 方法用來為緩沖區(qū)做準(zhǔn)備,進行 put 操作或者準(zhǔn)備新的讀序列。clear() 將界限設(shè)置到容量的位置,并將位置置為0。
緩沖區(qū)rewind()
rewind() 方法用來再次讀取已經(jīng)獲取過的數(shù)據(jù)。rewind()將緩沖區(qū)位置置0。
如何讀NIO緩沖區(qū)
- 首先創(chuàng)建緩沖區(qū),分配容量。Buffer有一個 allocate(size) 方法,可以返回一個 Buffer 對象。ByteBuffer byteBuffer = ByteBuffer.allocate(512);
- 進行 flip 操作,準(zhǔn)備進行讀操作。byteBuffer.flip();
- 下面可以讀入數(shù)據(jù)。int numberOfBytes = fileChannel.read(byteBuffer);
- 接下來可以從緩沖區(qū)讀取數(shù)據(jù)。char c = (char)byteBuffer.get();
如何寫NIO緩沖區(qū)
- 創(chuàng)建緩沖區(qū),分配容量。ByteBuffer byteBuffer = ByteBuffer.allocate(512); //容量設(shè)為512
- 寫入數(shù)據(jù)。byteBuffer.put((byte) 0xff);
以上就是讀寫緩沖區(qū)的兩個例子。緩沖區(qū)有很多種類型以及很多種讀寫方法。你可以根據(jù)使用要求進行選擇。
原文鏈接: javapapers 翻譯: ImportNew.com - lemeilleur
譯文鏈接: http://www.importnew.com/16721.html