Java NIO (一)

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)

==================

相關文章
相關標籤/搜索