java NIO 之 buffer and channel

作为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未标识

 
调用duplicate(新生成缓冲器,与原缓冲器共享整个数据源):position为5,limit为6,capacity为8,mark为3
调用slice(新生成缓冲器的片断,并且共享数据源):position为0,limit为3,capacity为3,mark未标识 
常用方法: 方法名 说明 
position() 返回当前位置 
position(int index) 将index设为当前位置 
limit() 返回当前限度 
limit(int newLimit) 将newLimit设为当前限度 
clear() position设0,limit设capacity,取消所有mark 
rewind() position设0,取消所有mark
 flip() limit设为当前position,position设为0
以上只列出一些基本的方法使用,更详细的请参阅参考文献3以及nio API 2.channel   
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); 

} 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值