java nio的一點整理(一)

最近看瘋狂java講義整理一下nio。傳統io的讀寫方法都是阻塞式的,自JDK1.4以後,java提供了一系列改進的輸入/輸出功能,稱之爲new io(nio)。Channel(通道)和Buffer(緩衝)是nio的2個新對象,channel與InputSteam,outputSteam最大的區別就是提供了一個map方法,經過該map方法能夠直接將一塊數據映射到內存區域中,若是說傳統io是面向流的處理,那麼nio是面向「塊」的處理。java

1.傳統io的流對象如圖數組

2.nio的buffer對象tcp

buffer對象有三個概念,容量(capacity),界限(limit),位置(position)測試

容量(capacity):緩衝區的的容量(capacity)表示該Buffer的最大數據容量。大數據

界限(limit):第一個不該該被讀出或者寫入的緩衝區位置索引。也就是位於limit後的數據即不可被讀,也不可被寫編碼

位置(position):用於指明下一個能夠被讀出的或者寫入的緩衝區位置索引線程

如圖:3d

buffer主要做用是裝入數據,而後輸出數據。相似傳統io中本身建立一個byte[],當buffer裝入數據結束後,調用buffer的flip(),該方法將limit設置爲position所在位置,並將position設置爲0。也就是說flip方法是輸出數據作好準備。當buffer輸出數據結束後,調用clear()方法,clear不是清空buffer的數據,而是將position設置爲0,limit設置爲和capacity同樣。orm

下面是測試代碼對象

執行結果以下:

2.channel對象

channel與傳統的流對象很相似,主要由2個區別
1.channel能夠將指定文件的部分或者所有映射成Buffer
 2.程序不能直接訪問channel中的數據,channel必須與buffer進行交互,pipe.SourceChannel 支持線程之間通訊的管道channel
 ServerSocketChannel SocketChannel是tcp協議通訊channel, DatagramChannel 是 UDP channel。

能夠說 nio必須是channel對象和buffer一塊兒使用

如上圖代碼,只是將一個java代碼複製到一個a.txt中。若是使用gbk編碼會報錯java.nio.charset.MalformedInputException: Input length = 1,由於該源碼裏面有中文,網上查了一下是由於 中文gbk是2個字節,utf-8是3個字節,意思是多了半個漢字致使這種問題。

傳統io去讀一個文件的時候,經過while循環去讀放入一個字節數組中。nio也能夠經過這種方式去讀,雖然map()方法把一個文件數據所有映射到buffer中,可是有時候文件有可能會很是大。

以下面代碼:

相關文章
相關標籤/搜索