Java NIO Channel

Java NIO 通道,原文地址:http://tutorials.jenkov.com/java-nio/channels.html

Java NIO 中的通道和流是相似的,但还是有以下几点不同之处:

  • 你可以从通道中读数据,也可以向通道中写数据;而流只能是单向的进行一种操作。
  • 从通道中读写数据可以使用异步的方式。
  • 通道总是与缓冲区协作进行读写操作。

正如上文说的,你可以从通道读数据到缓冲区,也可以从缓冲区读数据到通道。以下插图描述了这个过程:
Java NIO: Channels read data into Buffers, and Buffers write data into Channels

通道的实现

以下是 Java NIO 中通道的一些重要的实现:

  • 文件通道
  • 数据报通道
  • 套接字通道
  • 服务器端套接字通道

文件通道可以从文件中读写数据。
数据报通道可以从使用 UDP 协议的网络上读写数据。
套接字通道可以从使用 TCP 协议的网络上读写数据。
服务器端套接字通道可以让你像一个服务器一样监听 TCP 连接请求,并未每一个请求创建一个套接字通道。

基本的通道实例

以下是个使用文件通道从文件中读取数据,写入到缓冲区的简单案例:

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

请注意方法 buf.flip() 的调用。首先你从文件中读出数据写入了缓冲区,然后你翻转了缓冲区的位置记录。最后你从缓冲区中把数据读取出来。在下一小节中,我将会详细讲解缓冲区。