Java NIO Channel

Java中nio的通道和流有一些不同之处:

 1.通道可以同时支持读与写,而流只能是其中之一;

 2.通道支持异步读写;

 3.通道的读写都通过Buffer缓冲空间进行。

通道的读写流程如下:



 

通道的几种实现:

  • FileChannel(服务于文件)
  • DatagramChannel(服务于UDP数据报)
  • SocketChannel(服务于TCP 的数据读写)
  • ServerSocketChannel(服务于TCP 服务端,监听请求的TCP连接,为每个连接创建一个SocketChannel )

基本通道使用的例子

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()的调用,首先它读取数据到缓冲空间,然后flip会从缓冲空间读出来。

猜你喜欢

转载自clearity.iteye.com/blog/2057128