NIO Channel类图Overview
Channel
Channel
由上图可以看出,所有的Channel相关实现类最底层都实现了java.nio.channels.Channel接口,代码如下
Channel接口只提供了方法的定义。并没有具体的实现,而具体的通道实现使用操作系统的本地代码,所以不同操作系统的Channel实现会有很大的区别,但达到了最大限度的提高IO效率。
Readable和Writable
对于Channel,JDK定义了两种操作权限,一种是读权限(ReadableByteChannel),一种是写权限(WritableByteChannel),对应操作系统级别的读写权限,而所有的实现都是面向字节的操作,因为操作系统级别的IO操作都是字节级别的实现。
Scatter和Gather
针对ReadableByteChannel和WritableByteChannel只能针对单个ByteBuffer对象进行读写操作的缺点,JDK还扩展出了ScatteringByteChannel和GatheringByteChannel分别针对批量的读和写操作。Scatter/Gather可以在多个缓冲区上实现一个IO操作。大多数现代操作系统都支持本地矢量I/O(native vectored I/O)。当在一个通道上请求一个Scatter/Gather操作时,该请求会被翻译为适当的本地调用来直接填充或抽取缓冲区。
FileChannel
针对FileChannel的打开,JDK有三种实现如下:
RandomAccessFile.getChannel() |
ReadableByteChannel, WritableByteChannel |
FileInputStream.getChannel() |
ReadableByteChannel |
FileOutputStream.getChannel() |
WritableByteChannel |
RandomAccessFileTest
其他常用方法
position() |
获取当前游标位置 |
position(long newPosition) |
设置游标位置 |
truncate(long size) |
截取文件,指定长度后的内容将被删除 |
force(boolean metaData) |
将通道中尚未写入磁盘的数据强制写到磁盘上 |
SocketChannel
ServerSocketChannel
DatagramChannel
DatagramChannelServerTest
DatagramChannelClientTest
参考资料
JAVA-NIO(英文版) - Ron Hitchens
JAVA-NIO(中文版) - Ron Hitchens(著) 裴小星(译)
Java nio tutorial : http://tutorials.jenkov.com/java-nio/index.html
并发编程网:Java NIO系列教程-中文翻译版 : http://ifeve.com/overview/