原文连接 Java NIO Channel
Java NIO Channels 和流非常类似,但还是有一些小的区别。
-
Channels
是可读和可写的,流一般都是单向的(读或写 )。 -
Channels
可以以异步的方式读或者写。 -
Channels
通 常读取或者写入缓冲区。
如上所述,你可以从 channel
读取数据写入到 buffer
,或者从 buffer
读取数据写入到 channel
。下面是一个示意图。

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