2 Java NIO Channel-翻譯

王金龍發表於2017-12-06

Java NIO通道跟流類似,但有以下不同之處。

  • 通道可以同時讀寫,但流只是單向的。
  • 通道可以非同步地進行讀寫。
  • 通道都是從快取中進行讀或寫操作的。

正如以上所提到的,你可以將資料從Channel寫入到Buffer,也可以將資料從Buffer讀取寫入到Channel,如下圖中所示。

image

Channel 實現

Channel的主要實現類有以下幾種

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

FileChannel負責從檔案中進行讀寫資料。

DatagramChannel負責從UDP網路中讀寫資料。

SocketChannel負責從TCP網路中讀寫資料。

ServerSocketChannel可以監聽指定的TCP連線,像一個Web伺服器那樣。對於每一個建立的連線會建立一個新的SocketChannel。

Channel基本使用例子

以下是一個使用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它,並讀取buf中的資料。該方法將在後面Buffer的章節中進行詳細介紹。

相關文章