JAVA NIO系列(三) Buffer 解讀

2021-07-23 08:59:43 字數 2169 閱讀 1523

nio中的buffer用於和通道互動,資料是從通道讀入緩衝區,從緩衝區中寫入通道的。buffer就像乙個陣列,可以儲存多個型別相同的資料。每種基本資料型別都有對應的buffer類:

1、capacity(容量):buffer本質是乙個陣列,在初始化時有固定的大小,這個值就是容量。容量不可改變,一旦緩衝區滿了,需要將其清空才能將繼續進行讀寫操作。

2、position(位置):表示當前的位置,初始化時為0,當乙個基本資料型別的資料寫入buffer時,position會向前移動到下乙個可插入資料的buffer單元。position最大值可以是 capacity-1。

3、limit(限制):在緩衝區寫模式下,limit表示你最多能往buffer裡寫多少資料,大小等於capacity;在緩衝區讀模式下,limit表示能從緩衝區內讀取到多少資料,因此,當切 換buffer到讀模式時,limit會被設定成寫模式下的position值。

public class buffertest  buffer.clear; } channel.close; channel1.close; fis.close; } }
執行結果:

通道檔案的大小:36 緩衝區初始化時當前位置:0 緩衝區初始化時可寫的限制:20 ---------迴圈開始----- 緩衝區寫模式下當前位置:20 緩衝區寫模式下的限制:20 緩衝區讀模式下當前位置:0 緩衝區讀模式下的限制:20 緩衝區寫模式下當前位置:16 緩衝區寫模式下的限制:20 緩衝區讀模式下當前位置:0 緩衝區讀模式下的限制:16
1、檔案的大小為36個位元組,緩衝區初始化的大小為20個位元組,程式中進行了兩次讀取操作,才完成了檔案內容的複製。

2、可以看到,在緩衝區寫模式下,limit的大小始終等於capacity;而在讀模式下,limit等於模式切換前position的大小。

buffer物件的獲取需要進行分配,每種型別的buffer物件都有乙個allocate方法。我們以程式中的bytebuffer物件為例:

bytebuffer buffer = bytebuffer.allocate(20);
我們去跟蹤下原始碼:

1 public static bytebuffer allocate(int capacity)
heapbytebuffer(int cap, int lim)
buffer(int mark, int pos, int lim, int cap)  }
//陣列的建立在bytebuffer類裡面已經建立,在父類buffer裡,初始化容量、限制、位置等一些公共屬性。

buffer.flip該方法是用於將緩衝區從寫模式切換到讀模式,這是一種固定寫法,該方法的原始碼如下:

public final buffer flip
呼叫flip方法會將position設回0,並將limit設定成之前position的值。

public final buffer rewind
將position的位置設定為0,表示可以重新讀取buffer中的所有資料,limit保持不變。

1 public final buffer clear { 2 position = 0; 3 limit = capacity; 4 mark = -1; 5 return this;
1、一旦完成對buffer中資料的讀取,需要讓buffer做好再次被寫入的準備,這時候可以呼叫clear方法來完成。

2、clear方法將position設定為0,limit設定為容量的值,也就意味著buffer被清空了,但是這個清空的概念是寫入資料可以從緩衝區的指定位置開始,但buffer裡面的資料並沒有 刪除。

3、如果buffer裡面還有資料沒有被讀取,這個時候呼叫clear方法會導致那些資料被「遺忘」,因為沒有標記告訴你哪些是讀取過哪些沒有被讀取。

1、通過channel寫入;

2、通過buffer的put方法寫入:

buffer.put("channel".getbytes);
1、通過channel讀取;

2、通過buffer的get方法讀取:

byte b = buffer.get;

javaNIO學習筆記之緩衝區Buffer

buffer有四個屬性 1 capacit 容量 2 limit 上界 3 position 位置 4 mark 標記 絕對儲存不會影響緩衝區的位置屬性 存和取的方法 public abstract byte get public abstract byte get int index public...

Java NIO 系列教程(四)

為進一步提高io的效率,使用了多執行緒來解決這個問題,但是執行緒的數量總是會因為cpu的切換到達負荷值。選擇器是用來監控通道的i o的狀態,等client的資料準備就緒,就通知server來處理,這期間server中的執行緒可以做其他的事情。1 連線channel 2 緩衝區buffer 3 選擇器...

Java NIO學習總結三(Selector)

public class selectortest else if sktemp.isreadable if bb.position bb.capacity bb.clear keys.remove sktemp catch ioexception e 上例中可以看出使用selector的一般過程,...