91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

如何分析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

五华县| 乌拉特中旗| 漳平市| 铅山县| 沭阳县| 北宁市| 湖州市| 静乐县| 阿尔山市| 神农架林区| 瓦房店市| 平度市| 沾化县| 夹江县| 泸西县| 涪陵区| 三门县| 富顺县| 盈江县| 株洲县| 额济纳旗| 伊宁县| 洛隆县| 江孜县| 依兰县| 札达县| 织金县| 芷江| 广宁县| 台东市| 宽甸| 永吉县| 北海市| 莲花县| 东兰县| 若尔盖县| 体育| 竹山县| 皋兰县| 昌黎县| 通道|