Java NIO Channel通道

原文連接:http://tutorials.jenkov.com/java-nio/channels.htmlhtml

Java NIO Channel通道和流很是類似,主要有如下幾點區別:java

  • 通道能夠讀也能夠寫,流通常來講是單向的(只能讀或者寫)。
  • 通道能夠異步讀寫。
  • 通道老是基於緩衝區Buffer來讀寫。

正如上面提到的,咱們能夠從通道中讀取數據,寫入到buffer;也能夠從buffer內讀數據,寫入到通道中。下面有個示意圖:dom

overview-channels-buffers.png

Java NIO: Channels read data into Buffers, and Buffers write data into Channels異步

Channel的實現(Channel Implementations)

下面列出Java NIO中最重要的集中Channel的實現:spa

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

FileChannel用於文件的數據讀寫。 DatagramChannel用於UDP的數據讀寫。 SocketChannel用於TCP的數據讀寫。 ServerSocketChannel容許咱們監聽TCP連接請求,每一個請求會建立會一個SocketChannel.code

Channel的基礎示例(Basic Channel Example)

這有一個利用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

相關文章
相關標籤/搜索