【譯】Java NIO 簡明教程系列之 Channel

coderlmm發表於2018-10-13

原文連線 Java NIO Channel

Java NIO Channels 和流非常類似,但還是有一些小的區別。

  • Channels 是可讀和可寫的,流一般都是單向的(讀或寫 )。

  • Channels 可以以非同步的方式讀或者寫。

  • Channels通 常讀取或者寫入緩衝區。

如上所述,你可以從 channel 讀取資料寫入到 buffer,或者從 buffer 讀取資料寫入到 channel。下面是一個示意圖。

Java NIO: Channels read data into Buffers, and Buffers write data into Channels

Channel 的實現(Channel Implementations)

下面是 Java NIO 中比較重要的 Channel 的實現類的列表:

  • FileChannel 負責檔案讀寫。

  • DatagramChannel 用於在網路上的以 UDP 方式的資料讀寫。

  • SocketChannel 用於在網路上的以 TCP 方式的資料讀寫。

  • ServerSocketChannel 用於監聽 TCP 連線,類似於 web 服務,為每一個連線建立對應的 SocketChannel

基礎的管道示例( Basic Channel Example)

這是一個使用 FileChannel 讀取資料到 Buffer 中的例子。

	RandomAccessFile aFile =
			new RandomAccessFile("data/nio-data.txt", "rw");
	FileChannel inChannel = aFile.getChannel();

	ByteBuffer buf = ByteBuffer.allocate(48);

	int bytesRead = inChannel.read(buf);
	while (bytesRead != -1) {

		System.out.println("Read " + bytesRead);
		buf.flip();

		while (buf.hasRemaining()) {
			System.out.print((char) buf.get());
		}

		buf.clear();
		bytesRead = inChannel.read(buf);
	}
	aFile.close();
複製程式碼

注意 buf.flip(),首先讀取資料到 Buffer 中,然後通過 buf.flip() 方法翻轉它,就可以從裡面把資料讀取出來了。我會在下面章節結介紹更多的細節。

相關文章