Java NIO Channels类似于流又有一些不同:
- 你可以读和写到Channels。流通常是单向的(读或者写).
- Channels 可以异步读写。
- Channels通常写到Buffer,或者从里面读。
如同上面提到的,你从channel里读取数据到buffer,从buffer写数据到channel。这里是这个插图:
Java NIO: Channels读数据到Buffers,和Buffer写数据到Channels。
Channel Implementations
这里是在Java NIO里非常重要的channel实现:
· FileChannel(文件通道)
· DatagramChannel(数据通道)
· SocketChannel(套接字通道)
· ServerSocketChannel(服务端套接字通道)
FileChannel 从文件里读取数据到文件。
DatagramChannel可以使用UDP协议在网络上读取和写数据。
SocketChannel 可以使用TCP在网络上读取和写数据。
ServerSocketChannel 允许监听入栈的TCP连接,就像web服务器做的那样。对于每一个入栈的连接,创建一个SocketChannel。
Basic Channel 例子
这里是使用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。然后你flip它。然后你从中读取。将在后面关于Buffer的内容里更多的介绍这个。