Java NIO channels

Java NIO channels

Java 中的channel和流有如下的區別

  • 既可以從通道中讀取數據,又可以寫數據到通道。但流的讀寫通常是單向的。
  • 通道可以異步地讀寫。
  • 通道中的數據總是要先讀到一個Buffer,或者總是要從一個Buffer中寫入。

正如上面所說,從通道讀取數據到緩沖區,從緩沖區寫入數據到通道。如下圖所示:

image

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

Channel 的實現

下面是channel的重要的實現

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

FileChannel是從file中讀取或者是寫入到file中去
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,然后反轉Buffer,接著再從Buffer中讀取數據。下一節會深入講解Buffer的更多細節。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Java NIO(New IO)是從Java 1.4版本開始引入的一個新的IO API,可以替代標準的Java I...
    JackChen1024閱讀 7,578評論 1 143
  • Java NIO(New IO)是從Java 1.4版本開始引入的一個新的IO API,可以替代標準的Java I...
    zhisheng_blog閱讀 1,130評論 0 7
  • (轉載說明:本文非原創,轉載自http://ifeve.com/java-nio-all/) Java NIO: ...
    數獨題閱讀 817評論 0 3
  • (轉載說明:本文非原創,轉載自http://ifeve.com/java-nio-all/) Java NIO: ...
    柳岸閱讀 828評論 0 3
  • 這一年 走的太甜美 三季的笑 笑向一個臉龐 笑開了心花 笑得像風中的鈴鐺 春日的聘婷 夏日的怒放 秋日的長思 像霜...
    紫雨true閱讀 177評論 0 2