[翻译] java NIO Channel

时间:2021-11-16 11:11:33

原文地址;http://tutorials.jenkov.com/java-nio/channels.html

JAVA NIO channels和流的概念很像,下面是他们的一些区别:

  • 你可以对channel进行读写,流只能一种操作(读或写)。
  • channel可以异步的读写。
  • channel总是读入、写出到buffer。

根据上面提到的,你可以从channel中读取数据到buffer中,也可以从buffer中写入数据到channel中。下即可解释:

[翻译] java NIO Channel

JAVA NIO: channels读入数据到buffers,buffers写入数据到channels

Channel 实现

下面是JAVA NIO 中最重要的channel的实现。

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

FileChannel从文件中读写数据。

DatagramChannel通过UDP读写数据。

SocketChannel通过TCP读写数据。

ServerSocketChannel像一个web server那样,允许你监听TCP连接。每一个连接都会产生一个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();

注意flip()方法的调用,开始你读取数据到buffer,然后转换,即由读转换到写,然后从buffer中读取数据。这个问题将会在下一节的Buffer中详细的介绍。