Java NIO Channel通道和流很是类似,主要有如下几点区别:java
正如上面提到的,咱们能够从通道中读取数据,写入到buffer;也能够从buffer内读数据,写入到通道中。下面有个示意图:dom
Java NIO: Channels read data into Buffers, and Buffers write data into Channels异步
下面列出Java NIO中最重要的集中Channel的实现:spa
FileChannel用于文件的数据读写。 DatagramChannel用于UDP的数据读写。 SocketChannel用于TCP的数据读写。 ServerSocketChannel容许咱们监听TCP连接请求,每一个请求会建立会一个SocketChannel.code
这有一个利用FileChannel读取数据到Buffer的例子:htm
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()方法。接着再把数据读取出来。在后续的章节中咱们还会讲解先关知识。blog