相对于串流输入/输出使用InputStream、OutputStream来衔接数据源与目的地,NIO使用频道(Channel)来衔接数据节点,在处理数据时,NIO可以让你设定缓冲区(Buffer)容量,在缓冲区中对感兴趣的数据区块进行标记,像是标记读取位置、数据有效位置,对于这些区块标记,提供了clear()、rewind()、flip()、compact()等高级操作。
Channel架构与操作
- NIO中Channel相关接口与类,位于java.nio.channels套件中。
- Channel接口是AutoClosable的子接口。
- ReadableByteChannel定义了read()方法,将ReadableByteChannel中的数据读取至ByteBuffer。
- WritableByteChannel定义了write()方法,将ByteBuffer的数据写到WritableByteChannel中。
- ScatteringByteChannel定义了read()方法,将ScatteringByteChannel分配到ByteBuffer数组中。
- GatheringByteChannel定风了write()方法,将ByteBuffe数组的数据写到GatheringByteChannel。
- ByteChannel没有定义任何方法,其子接口SeekableByteChannel可以读取与改变下一个要存取数据的位置。
Buffer架构与操作
- 在NIO设计中,数据都是在java.nio.Buffer中处理,Buffer是个抽象类,定义了clear()、flip()、reset()、rewind()等对数据区块的高级操作,这类操作返回类型都是Buffer。
- 根据不同的数据类型处理需求,可以选择不同的Buffer子类
容量、界限与存取位置
allocate() 指定Buffer容量
capacity() 取得Buffer容量的大小
array() 取得Buffer内部的数组
wrap() 将某数组转为某个Buffer子类实例
isDirect() Buffer是否直接配置
limit() 得知或限定实际可读取或写入的数据界限索引值
position() 得知或限定下一个可读取数据的位置索引值
clear()、flip()、rewind()
- clear()方法用于写模式,其作用为清空Buffer中的内容,初始化缓存空间,例如读取文件时将文件内容置入缓存时要先执行此方法。所谓清空是指写上限与Buffer的真实容量相同,即limit==capacity,同时将当前写位置position置为最前端下标为0处。
- flip()方法的作用是将写模式转变为读模式,即将写模式下的Buffer中内容的最后位置变为读模式下的limit位置,作为读越界位置,同时将当前读位置position置为0,表示转换后从头开始读。
- rewind()在读写模式下都可用,它单纯的将当前位置position置0,而limit不变,这个方法通常用在想要重复读取Buffer中某段数据时使用,作用相当于单独调用Buffer的position(0)方法。
mark()、reset()、remaining()
- mark()方法的作用是在目前position上标记,即使position改变,也会将position设回被mark()标记的位置。
- reset()方法被调用,可以改变positon
- position与limit之间为剩余可存取的资料,可以使用remaining()方法得知其中的长度。
- hasRemaining()可以测试是否还有剩余可存取的数据。