Java NIO通道跟流类似,但有以下不同之处。
- 通道可以同时读写,但流只是单向的。
- 通道可以异步地进行读写。
- 通道都是从缓存中进行读或写操作的。
正如以上所提到的,你可以将数据从Channel写入到Buffer,也可以将数据从Buffer读取写入到Channel,如下图中所示。
Channel 实现
Channel的主要实现类有以下几种
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
FileChannel负责从文件中进行读写数据。
DatagramChannel负责从UDP网络中读写数据。
SocketChannel负责从TCP网络中读写数据。
ServerSocketChannel可以监听指定的TCP连接,像一个Web服务器那样。对于每一个建立的连接会创建一个新的SocketChannel。
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它,并读取buf中的数据。该方法将在后面Buffer的章节中进行详细介绍。