【译】Java NIO 简明教程系列之 Channel

106 阅读1分钟

原文连接 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() 方法翻转它,就可以从里面把数据读取出来了。我会在下面章节结介绍更多的细节。