中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何分析Java NIO中的Buffer對象

發布時間:2021-12-03 17:31:01 來源:億速云 閱讀:145 作者:柒染 欄目:云計算

本篇文章給大家分享的是有關如何分析Java NIO中的Buffer對象,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

在緩沖區中,最重要的屬性有下面三個,它們一起合作完成對緩沖區內部狀態的變化跟蹤:

position:指定了下一個將要被寫入或者讀取的元素索引,它的值由get()/put()方法自動更新,在新創建一個Buffer對象時,position被初始化為0。

limit:指定還有多少數據需要取出(在從緩沖區寫入通道時),或者還有多少空間可以放入數據(在從通道讀入緩沖區時)。

capacity:指定了可以存儲在緩沖區中的最大數據容量,實際上,它指定了底層數組的大小,或者至少是指定了準許我們使用的底層數組的容量。

以上四個屬性值之間有一些相對大小的關系:0 <= position <= limit <= capacity。如果我們創建一個新的容量大小為10的ByteBuffer對象,在初始化的時候,position設置為0,limit和 capacity被設置為10,在以后使用ByteBuffer對象過程中,capacity的值不會再發生變化,而其它兩個個將會隨著使用而變化。四個屬性值分別如圖所示:

現在我們可以從通道中讀取一些數據到緩沖區中,注意從通道讀取數據,相當于往緩沖區中寫入數據。如果讀取4個自己的數據,則此時position的值為4,即下一個將要被寫入的字節索引為4,而limit仍然是10。

下一步把讀取的數據寫入到輸出通道中,相當于從緩沖區中讀取數據,在此之前,必須調用flip()方法,該方法將會完成兩件事情:

1. 把limit設置為當前的position值 
2. 把position設置為0

由于position被設置為0,所以可以保證在下一步輸出時讀取到的是緩沖區中的第一個字節,而limit被設置為當前的position,可以保證讀取的數據正好是之前寫入到緩沖區中的數據,如下圖所示:

現在調用get()方法從緩沖區中讀取數據寫入到輸出通道,這會導致position的增加而limit保持不變,但position不會超過limit的值,所以在讀取我們之前寫入到緩沖區中的4個自己之后,position和limit的值都為4。

在從緩沖區中讀取數據完畢后,limit的值仍然保持在我們調用flip()方法時的值,調用clear()方法能夠把所有的狀態變化設置為初始化時的值,

最后我們用一段代碼來驗證這個過程,如下所示:

[java] view plain copy

 print?

  1. import java.io.*;  

  2. import java.nio.*;  

  3. import java.nio.channels.*;  

  4.   

  5. public class Program {  

  6.     public static void main(String args[]) throws Exception {  

  7.         FileInputStream fin = new FileInputStream("d:\\test.txt");  

  8.         FileChannel fc = fin.getChannel();  

  9.   

  10.         ByteBuffer buffer = ByteBuffer.allocate(10);  

  11.         output("初始化", buffer);  

  12.   

  13.         fc.read(buffer);  

  14.         output("調用read()", buffer);  

  15.   

  16.         buffer.flip();  

  17.         output("調用flip()", buffer);  

  18.   

  19.         while (buffer.remaining() > 0) {  

  20.             byte b = buffer.get();  

  21.             // System.out.print(((char)b));  

  22.         }  

  23.         output("調用get()", buffer);  

  24.   

  25.         buffer.clear();  

  26.         output("調用clear()", buffer);  

  27.   

  28.         fin.close();  

  29.     }  

  30.   

  31.     public static void output(String step, Buffer buffer) {  

  32.         System.out.println(step + " : ");  

  33.         System.out.print("capacity: " + buffer.capacity() + ", ");  

  34.         System.out.print("position: " + buffer.position() + ", ");  

  35.         System.out.println("limit: " + buffer.limit());  

  36.         System.out.println();  

  37.     }  

  38. }  

完成的輸出結果與我們上面演示的過程一致。

以上就是如何分析Java NIO中的Buffer對象,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平度市| 张家界市| 兴业县| 五大连池市| 东光县| 福州市| 宜春市| 农安县| 台江县| 新余市| SHOW| 昭平县| 安吉县| 尉犁县| 浮梁县| 托克逊县| 彭山县| 康保县| 庐江县| 东兴市| 东乌| 和田市| 台中县| 富裕县| 青浦区| 辽宁省| 交口县| 江山市| 襄垣县| 青铜峡市| 澄城县| 南部县| 九江县| 定襄县| 宝兴县| 遂平县| 沽源县| 电白县| 溧阳市| 临洮县| 淮安市|