03. Java NIO Channel通道

原文链接:http://tutorials.jenkov.com/java-nio/channels.html

Java NIO Channel通道和流非常相似,主要有以下几点区别:

  • 通道可以读也可以写,流一般来说是单向的(只能读或者写)。
  • 通道可以异步读写。
  • 通道总是基于缓冲区Buffer来读写。

正如上面提到的,我们可以从通道中读取数据,写入到buffer;也可以中buffer内读数据,写入到通道中。下面有个示意图:

overview-channels-buffers.png

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

Channel的实现(Channel Implementations)

下面列出Java NIO中最重要的集中Channel的实现:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

FileChannel用于文件的数据读写。
DatagramChannel用于UDP的数据读写。
SocketChannel用于TCP的数据读写。
ServerSocketChannel允许我们监听TCP链接请求,每个请求会创建会一个SocketChannel.

Channel的基础示例(Basic Channel Example)

这有一个利用FileChannel读取数据到Buffer的例子:

  1. RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
  2. FileChannel inChannel = aFile.getChannel();
  3. ByteBuffer buf = ByteBuffer.allocate(48);
  4. int bytesRead = inChannel.read(buf);
  5. while (bytesRead != -1) {
  6. System.out.println("Read " + bytesRead);
  7. buf.flip();
  8. while(buf.hasRemaining()){
  9. System.out.print((char) buf.get());
  10. }
  11. buf.clear();
  12. bytesRead = inChannel.read(buf);
  13. }
  14. aFile.close();

注意buf.flip()的调用。首先把数据读取到Buffer中,然后调用flip()方法。接着再把数据读取出来。在后续的章节中我们还会讲解先关知识。