通道和緩衝區

2022-05-02 15:51:08 字數 2614 閱讀 2234

通常來說nio中的所有io都是從channel開始的。channel和流有點類似。通過channel,我們即可以從channel把資料寫到buffer中,也可以把資料從buffer寫入到channel,下圖是乙個示意圖: 

通道可以理解成一種連線,根據連線物件的不同,可以分為下面這些型別

檔案連線:filechannel,用於檔案的讀寫

udp連線:datagramchannel,用於udp資料的讀寫

socket客戶端:socketchannel,用於tcp資料的讀寫

socket服務端:serversocketchanel,用於監聽tcp連線,每個請求都會生成乙個socketchannel

通道的作用相當於基本io中的流,但有如下幾點區別:

1、通道可以讀也可以寫,而流只能讀或者寫

2、通道可以非同步讀寫,而流在讀或寫的時候,都是阻塞的

3、通道總是基於緩衝區buffer來讀寫的,而流的讀寫是基於虛擬機器記憶體的

demo01:使用通道來進行檔案的讀取

1

/**2

* 使用通道讀檔案資料3*/

4public

void

readfile()

24 } catch

(ioexception e)

27 }

用到了如下知識

1、path表示路徑

2、使用charserdecoder進行解碼

3、bytebuffer到charbuffer之間使用解碼器進行轉換

4、使用twr實現資源的安全關閉

5、緩衝區的flip與clear操作

demo02:使用通道實現檔案的寫入

1

/**2

* 開啟並寫資料3*

4* @throws

ioexception5*/

6public

void openandwrite() throws

ioexception

2425

}26 }

緩衝區根據快取的內容不同,可以分為如下幾類

bytebuffer

charbuffer

doublebuffer

floatbuffer

intbuffer

longbuffer 

shortbuffer 

buffer本質是就是一塊記憶體區,可以用來讀寫資料,這塊記憶體被nio包裝起來,對外提供了一系列便於開發的介面

先來說說buffer的共性

1、capacity,所有的緩衝區都有乙個初始大小,它代表了這塊緩衝區的容量,不可改變

2、limit,讀寫操作允許的最大位置。剛開始建立的時候,limit等於capacity

3、position,當前讀寫位置。初始化時為0.一旦寫資料,寫乙個就往後移動乙個單元,最大值為capacity-1

buffer提供的很多方式都是在對以上三個屬性進行操作

舉例:讀緩衝區前:呼叫flip,limit設為當前的position,position設為0.這樣在讀取的時候才能將有效資料全部讀取出來

讀緩衝區後:如果全部讀完了,呼叫clear,對buffer重新初始化,compact 方法會將已經讀取到的資料清除出緩衝區,未讀取的資料通通往前移

重複讀取:rewind,將position設為0,limit保持不變

其他操作

mark,記錄當前position

reset,恢復到mark時候的position

其他方法詳見api

關於limit,buffer在讀和寫的時候含義有所區別,見下圖

1、將乙個通道中的資料一次性寫入到多個緩衝區中

bytebuffer header = bytebuffer.allocate(128);

bytebuffer body = bytebuffer.allocate(1024);

bytebuffer bufferarray =;

channel.read(bufferarray);

在寫入緩衝區陣列過程中,按照順序去填充緩衝區,適合報文長度固定的情況。

2、多個緩衝區的資料寫入到乙個通道中

bytebuffer header = bytebuffer.allocate(128);

bytebuffer body = bytebuffer.allocate(1024);

//write data into buffers

bytebuffer bufferarray =;

channel.write(bufferarray);

按照順序,從position到limit之間的資料會被寫入到channel中

public

void

copyfile() catch

(ioexception e)

}

Java NIO 入門學習 通道和緩衝區

對於 nio 來說,channel 通道 和 buffer 緩衝區 這兩個東西是不得不提的,因為它們是 nio 的核心物件,幾乎每乙個 i o 操作都要它們。通道是對原 i o 流的模擬,但有不同的是它是雙向的,不再像流那樣分 inputstream 和 outputstream,通道的雙向性更好的...

scanf,getchar讀取字元和緩衝區

首先我們來看這樣一段 include intmain printf 請輸入密碼 scanf s password printf 請確認密碼 y n int ch getchar if ch y else 是不是有些同學會認為輸完密碼後,再輸入y就會列印出確認成功呢,但實際上卻並是這樣 可以看到程式並...

mysql 快取區 MYSQL緩衝區和快取設定

mysql緩衝區和快取設定 mysql 支援超過 100 個的可調節設定 但是幸運的是,掌握少數幾個就可以滿足大部分需要。查詢這些設定的正確值可以通過 show status 命令檢視狀態變數,從中可以確定 mysqld 的運作情況是否符合我們的預期。給緩衝區和快取分配的記憶體不能超過系統中的現有記...