NIO(二): 通道 Channel

 

一:channel

        用於 I/O 操做的鏈接。安全

        通道表示到實體,如硬件設備、文件、網絡套接字或能夠執行一個或多個不一樣 I/O 操做(如讀取或寫入)的程序組件的開放的鏈接。服務器

        通道可處於打開或關閉狀態。建立通道時它處於打開狀態,一旦將其關閉,則保持關閉狀態。一旦關閉了某個通道,試圖對其調用 I/O 操做就會致使 ClosedChannelException 被拋出。經過調用通道的 isOpen 方法可測試通道是否處於打開狀態。網絡

        正如擴展和實現此接口的各個接口和類規範中所描述的,通常狀況下通道對於多線程的訪問是安全的。多線程

public interface Channelextends Closeable

 

二:channel 與流比較併發

       Java NIO 的channel相似流,可是有不一樣,dom

                既能夠從通道中讀取數據,又能夠寫數據到通道。但流的讀寫一般是單向的。異步

                通道能夠異步地讀寫。測試

                通道中的數據老是要先讀到一個Buffer,或者老是要從一個Buffer中寫入。spa

        正如上面所說,從通道讀取數據到緩衝區,從緩衝區寫入數據到通道。以下圖所示:線程

                                                                                                    

 

JAVA NIO中的一些主要Channel的實現:

FileChannel : 用於讀取、寫入、映射和操做文件的通道。(多個併發線程可安全地使用文件通道。)

DatagramChannel : 針對面向數據報套接字的可選擇通道。(數據報通道不是網絡數據報套接字的完整抽象。)

SocketChannel : 針對面向流的鏈接套接字的可選擇通道。(套接字通道不是鏈接網絡套接字的完整抽象)

ServerSocketChannel :針對面向流的偵聽套接字的可選擇通道。(服務器套接字通道不是偵聽網絡套接字的完整抽象。)

即:

FileChannel 從文件中讀寫數據。

DatagramChannel 能經過UDP讀寫網絡中的數據。

SocketChannel 能經過TCP讀寫網絡中的數據。

ServerSocketChannel能夠監聽新進來的TCP鏈接,像Web服務器那樣。對每個新進來的鏈接都會建立一個SocketChannel。

 

基本的channel示例

下面是一個使用FileChannel讀取數據到Buffer中的示例:

public class Test1Channel {

	public static void main(String[] args) throws IOException {

//		File file = new File("data/niodata.txt");
//		RandomAccessFile aFile = new RandomAccessFile(file, "rw");
		
		//建立從中讀取和向其中寫入(可選)的隨機訪問文件流
		RandomAccessFile aFile = new RandomAccessFile("data/niodata.txt", "rw");
		
		System.out.println(aFile.length());	 // 返回此文件的長度。
		
		//FileChannel:用於讀取、寫入、映射和操做文件的通道。 
		//從文件中讀寫數據。
		FileChannel inChannel = aFile.getChannel();
		
		//allocate(20) 分配一個新的字節緩衝區。
		ByteBuffer buf = ByteBuffer.allocate(10);

		// read(buf) 將字節序列今後通道讀入給定的緩衝區。
		int bytesRead = inChannel.read(buf); 
		
		while (bytesRead != -1) {

			//System.out.println("Read " + bytesRead);
			
			buf.flip().position(); // 反轉緩衝區 

			//hasRemaining():告知在當前位置和限制之間是否還有元素。
			while(buf.hasRemaining()){
				System.out.print((char) buf.get()+ "  ");
			}

			buf.clear(); // 清除此緩衝區。
			
			bytesRead = inChannel.read(buf);
		}
		aFile.close();
	}

}

 

 

注意:


public RandomAccessFile(String name,String mode):

        

mode 參數指定用以打開文件的訪問模式。容許的值及其含意爲:

含意

"r"

以只讀方式打開。調用結果對象的任何 write 方法都將致使拋出 IOException

"rw"

打開以便讀取和寫入。若是該文件尚不存在,則嘗試建立該文件。

"rws"

打開以便讀取和寫入,對於 "rw",還要求對文件的內容或元數據的每一個更新都同步寫入到底層存儲設備。

"rwd"  

打開以便讀取和寫入,對於 "rw",還要求對文件內容的每一個更新都同步寫入到底層存儲設備。

相關文章
相關標籤/搜索