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