Java NIO的通道相似流,但又有些不一样:服务器
正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。以下图所示:网络
这些是Java NIO中最重要的通道的实现:dom
FileChannel 从文件中读写数据。异步
DatagramChannel 能经过UDP读写网络中的数据。函数
SocketChannel 能经过TCP读写网络中的数据。blog
ServerSocketChannel能够监听新进来的TCP链接,像Web服务器那样。对每个新进来的链接都会建立一个SocketChannel。ip
下面是一个使用FileChannel读取数据到Buffer中的示例:get
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,而后反转Buffer,接着再从Buffer中读取数据。下一节会深刻讲解Buffer的更多细节。flip()函数将position重置为0,将limit设置为原来的position的位置。