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

相关文章
相关标签/搜索