Java NIO中的Channel和Stream很像,但是又有一些不同点:
- 在Channel中可读也可写(双工)的。一般来说Stream是可读或者可写(单工)的。
- Channel的读和写可以是异步的。
- Channel面向的是Buffer。
正如上面提到的,通过Channel可以读又可以写,下图说明了这一点:

Channel的实现
下面列出了一些重要的实现类:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
FileChannel是用读写文件的。
DatagramChannel是用来通过UDP协议读写数据的。
SocketChannel是用来通过TCP协议读写数据的。
ServerSocketChannel可以监听TCP连接,类似一个web服务一样。对于每个接入的连接都会创建一个SocketChannel(因此,以聊天室的应用场景为例,使用selector管理多个channel就会很高效)。
Channel基础示例
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中的数据取出来。后面会详细介绍这一部分内容。
本文深入探讨Java NIO中Channel与Stream的区别,Channel支持读写双工操作,可实现异步读写,并面向Buffer。文章列举了FileChannel、DatagramChannel、SocketChannel和ServerSocketChannel等关键实现,提供了基础示例代码。
1590

被折叠的 条评论
为什么被折叠?



