官术网_书友最值得收藏!

2.6.2 緩沖區數據結構

在使用內存映射時,我們創建了單一的緩沖區橫跨整個文件或我們感興趣的文件區域。我們還可以使用更多的緩沖區來讀寫大小適度的信息塊。

本節將簡要地介紹Buffer對象上的基本操作。緩沖區是由具有相同類型的數值構成的數組,Buffer類是一個抽象類,它有眾多的具體子類,包括ByteBuffer、CharBuffer、DoubleBuffer、IntBuffer、LongBuffer和ShortBuffer。

注意:StringBuffer類與這些緩沖區沒有關系。

在實踐中,最常用的將是ByteBuffer和CharBuffer。如圖2-10所示,每個緩沖區都具有:

·一個容量,它永遠不能改變。

·一個讀寫位置,下一個值將在此進行讀寫。

·一個界限,超過它進行讀寫是沒有意義的。

·一個可選的標記,用于重復一個讀入或寫出操作。

圖2-10 一個緩沖區

這些值滿足下面的條件:

0≤標記≤位置≤界限≤容量

使用緩沖區的主要目的是執行“寫,然后讀入”循環。假設我們有一個緩沖區,在一開始,它的位置為0,界限等于容量。我們不斷地調用put將值添加到這個緩沖區中,當我們耗盡所有的數據或者寫出的數據量達到容量大小時,就該切換到讀入操作了。

這時調用flip方法將界限設置到當前位置,并把位置復位到0?,F在在remaining方法返回正數時(它返回的值是“界限-位置”),不斷地調用get。在我們將緩沖區中所有的值都讀入之后,調用clear使緩沖區為下一次寫循環做好準備。clear方法將位置復位到0,并將界限復位到容量。

如果你想重讀緩沖區,可以使用rewind或mark/reset方法,詳細內容請查看API注釋。

要獲取緩沖區,可以調用諸如ByteBuffer.allocate或ByteBuffer.wrap這樣的靜態方法。

然后,可以用來自某個通道的數據填充緩沖區,或者將緩沖區的內容寫出通道中。例如:

這是一種非常有用的方法,可以替代隨機訪問文件。

java.nio.Buffer 1.4

·Buffer clear()

通過將位置復位到0,并將界限設置到容量,使這個緩沖區為寫出做好準備。返回this。

·Buffer flip()

通過將界限設置到位置,并將位置復位到0,使這個緩沖區為讀入做好準備。返回this。

·Buffer rewind()

通過將讀寫位置復位到0,并保持界限不變,使這個緩沖區為重新讀入相同的值做好準備。返回this。

·Buffer mark()

將這個緩沖區的標記設置到讀寫位置,返回this。

·Buffer reset()

將這個緩沖區的位置設置到標記,從而允許被標記的部分可以再次被讀入或寫出,返回this。

·int remaining()

返回剩余可讀入或可寫出的值的數量,即界限與位置之間的差異。

·int position()

·void position(int newValue)

返回這個緩沖區的位置。

·int capacity()

返回這個緩沖區的容量。

主站蜘蛛池模板: 乌海市| 嘉兴市| 汝阳县| 大竹县| 寿宁县| 瓮安县| 濉溪县| 浏阳市| 新丰县| 泰州市| 南郑县| 墨竹工卡县| 武强县| 龙海市| 荆州市| 宜宾县| 永顺县| 中江县| 深水埗区| 大宁县| 乐山市| 宣汉县| 洪江市| 株洲县| 寻乌县| 新余市| 讷河市| 隆化县| 车致| 容城县| 金沙县| 嘉黎县| 黄石市| 句容市| 剑川县| 武胜县| 清河县| 资阳市| 中超| 吴旗县| 万安县|