Java NIOjava
核心部分(簡單來講):服務器
Channels (通道)網絡
Buffers (緩衝區)
app
Selectors (選擇器)
dom
-----------------------------------------------------異步
Channel實現:spa
FileChannel (從文件中讀寫數據)線程
DatagramChannel (能經過UDP讀寫網絡中的數據 )
code
SocketChannel (能經過TCP讀寫網絡中的數據)
orm
ServerSocketChannel (能夠監聽新進入的TCP鏈接,像WEB服務器同樣,對每個新鏈接都創建一個SocketChannel )
-----------------------------------------------------
Buffer實現:
對應七種基本類型的:ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer
以及 MappedByteBuffer
-----------------------------------------------------
Selector : 選擇器容許單線程中處理多個Channel
-----------------------------------------------------
NIO與傳統IO的不一樣點
1:通道既能夠讀取數據、也能夠寫入數據到通道。
2:通道能夠異步讀寫數據
3:通道中的數據老是要先讀取到一個Buffer,或總要從一個Buffer中寫入
public static void main(String[] args) throws IOException { RandomAccessFile aFile = new RandomAccessFile("d:/繳費商戶記錄.txt","rw"); FileChannel inChannel = aFile.getChannel(); ByteBuffer buff = ByteBuffer.allocate(64); //設定緩衝區大小 int byteRead = 0;//inChannel.read(buff); 從通道讀取數據到緩衝區 while(byteRead != -1){ //System.out.println("Read---------->" + byteRead); buff.flip(); //反轉。切換讀/寫模式 while(buff.hasRemaining()){ //檢測緩衝區 System.out.print((char) buff.get()); //取數據 } /**clear()方法會清空整個緩衝區**/ //buff.clear(); /**compact()方法只會清除已經讀過的數據。 任何未讀的數據都被移到緩衝區的起始處, 新寫入的數據將放到緩衝區未讀數據的後面。**/ buff.compact(); byteRead = inChannel.read(buff); } aFile.close(); }
buffer與channel進行交互:
Channel讀取數據到Buffer中;
將Buffer的數據寫入到Channel;
Buffer的基本用法——四個步驟:
1:寫入數據到Buffer。
2:調用flip()方法,反轉讀/寫模式。
3:從Buffer中讀取數據。
4:調用clear() 或者 compact()方法。
a:在向Buffer寫入數據時,Buffer會記錄寫入了多少數據,一旦要讀取這些數據,須要經過flip()方法,將Buffer從寫模式謝歡到讀模式。
b:一旦讀完全部數據,就須要清空緩衝區,讓它能夠再次讀寫。
Buffer的工做原理:
緩衝區本質上市一塊能夠讀寫數據的內存,它被包裝成NIO的Buffer對象。
三個屬性: capacity、position、limit
capacity:總容量,也就是獲取緩衝區時設定的值
position:當前讀或寫的位置。
position和limit的值取決於buffer處於讀模式仍是寫模式
在寫數據到buffer時,position表示當前的位置,初始爲0,當一個數據寫入到buffer後,position會向前移動到下一個能夠插入數據的位置。position最大可爲 :capacity - 1
讀取數據時:從寫模式切換到讀模式,position會被置爲0,讀取將從position的位置開始,讀取後position向前移動到下一個位置。
limit : 在寫模式下,Buffer的limit表示你最多能往Buffer裏寫多少數據。 寫模式下,limit等於Buffer的capacity。
當切換Buffer到讀模式時, limit表示你最多能讀到多少數據。所以,當切換Buffer到讀模式時,limit會被設置成寫模式下的position值。換句話說,你能讀到以前寫入的全部數據(limit被設置成已寫數據的數量,這個值在寫模式下就是position)
==================