JavaNIO channels 和 streams相似中带有不同
- channels是全双工,支持同时读、写数据,streams同一时刻只能读,或者写
- channels支持异步读写
- channels总是从buffers 中读写
如上所言:程序可以从channel中读取数据到buffer中,也可以从buffer中读数据到channel中
Channel Implementations(通道的实现类)
下面是NIO中最重要的channel实现类:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
FileChannel :文件读写
DatagramChannel :UDP读写
SocketChannel :TCP读写
ServerSocketChannel :监听TCP连接,就像web服务器所做的那样。每来一个连接,都会创建一个SocketChannel对象。
简单示例:
用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读出数据。容后讲解buffers的细节。