通常來說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);按照順序,從position到limit之間的資料會被寫入到channel中bytebuffer body = bytebuffer.allocate(1024);
//write data into buffers
bytebuffer bufferarray =;
channel.write(bufferarray);
publicvoid
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 的運作情況是否符合我們的預期。給緩衝區和快取分配的記憶體不能超過系統中的現有記...