Java NIO Channel

63 阅读1分钟

Java NIO Channels类似于流又有一些不同:

  • 你可以读和写到Channels。流通常是单向的(读或者写).
  • Channels 可以异步读写。
  • Channels通常写到Buffer,或者从里面读。

如同上面提到的,你从channel里读取数据到buffer,从buffer写数据到channel。这里是这个插图:

Java NIO: Channels读数据到Buffers,和Buffer写数据到Channels。

Channel Implementations

这里是在Java NIO里非常重要的channel实现:

· FileChannel(文件通道)

· DatagramChannel(数据通道)

· SocketChannel(套接字通道)

· ServerSocketChannel(服务端套接字通道)

FileChannel 从文件里读取数据到文件。

DatagramChannel可以使用UDP协议在网络上读取和写数据。

SocketChannel 可以使用TCP在网络上读取和写数据。

ServerSocketChannel 允许监听入栈的TCP连接,就像web服务器做的那样。对于每一个入栈的连接,创建一个SocketChannel。

Basic 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它。然后你从中读取。将在后面关于Buffer的内容里更多的介绍这个。