作为nio的基础,本文主要介绍buffer和channel这两个重要的概念和应用。
1.buffer
capacity()
: buffer的最大容量limit()
: 已用的buffer量position()
: 当前定位下一个读/写的位置mark()
: 最后一次用reset()重置的位置
现在用一组图片演示例子:
初始状态:position为0,limit为10,capacity为10,mark未标识
加入5个字符 byteBuffer.put((byte)'H')……:position为5,limit为10,capacity为10,mark未标识
调用flip(limit设为当前position,position设为0) byteBuffer.flip():position为0,limit为6,capacity为10,mark未标识
调用slice(新生成缓冲器的片断,并且共享数据源):position为0,limit为3,capacity为3,mark未标识常用方法: 方法名 说明position() 返回当前位置position(int index) 将index设为当前位置limit() 返回当前限度limit(int newLimit) 将newLimit设为当前限度clear() position设0,limit设capacity,取消所有markrewind() position设0,取消所有markflip() limit设为当前position,position设为0以上只列出一些基本的方法使用,更详细的请参阅参考文献3以及nio API 2.channel
channel有3个主要的实现:FileChannel:主要实现文件锁,内存映射,跨连接传输Sockets:主要实现非阻塞,可选器,异步传输Pipe:一般通道,循环通道channel.write(buffer) 类似 buffer.get(byteArray)channel.read(buffer) 类似 buffer.put(byteArray)
以下是一段channel copy的代码,展示了channel和buffer的使用
public void channelCopy (ReadableByteChannel src, WritableByteChannel dest) throws IOException {
ByteBuffer buffer = ByteBuffer.allocate (16 * 1024);
while (src.read (buffer) != -1) {
// prepare the buffer to be drained
buffer.flip();
// write to the channel, may block
dest.write (buffer);
// if partial transfer, shift remaining elements down
// if buffer was empty, same as doing clear
buffer.compact();
}
buffer.flip();
// EOF leaves buffer in fill state
while (buffer.hasRemaining()) {
dest.write (buffer);
}
}