首页 > 编程知识 正文

bytebuffer.allocate,ringbuffer原理

时间:2023-05-06 18:53:18 阅读:134942 作者:266

在NIO中,数据读写操作始终与缓冲区相关联。 读取时通道将数据读入缓冲区,写入时先将发送的数据按顺序写入缓冲区。 缓冲区是固定长度的,基本上是列表,所有元素都是基本的数据类型。 ByteBuffer是最常见的缓冲区,提供读写其他数据

创建字节缓冲区

1.1分配(使用静态方法

bytebufferbuffer=byte buffer.allocate (256;

上面的方法创建256字节的ByteBuffer。 如果创建的缓冲区容量太小,则只能重新创建大小合适的缓冲区。

1.2包装并创建现有数组

通过包装方法创建的缓冲区将保留包装数组中存储的数据,如下所示

bytebufferbuffer=byte buffer.wrap (bytearray;

要将字符串存储在ByteBuffer中,请按如下方式操作:

字符串发送字符串='你好,服务器. ';

bytebuffersendbuffer=byte buffer.wrap (send string.getbytes (utf-16 ) );

2 .缓冲区倒带

buffer.flip (;

此方法用于将缓冲区准备为数据送出状态,执行上述方法后,输出通道将从数据的开头开始,而不是末尾开始。 倒带只是保持缓冲区中的数据不变,准备写入而不是读取。

3 .清除缓冲区

buffer.clear (;

这种方法实际上也不是更改缓冲区的数据,而是只重置缓冲区的主要索引值。不需要在每次读写时创建新的缓冲区。 这样做会降低性能。 相反,要复用当前的缓冲区,必须在再次读取之前清除缓冲区。

4 .从套接字频道(频道)读取数据

intbytesreaded=socket channel.read (buffer );

执行以上方法将通道从套接字读取的数据写入缓冲区,并返回成功读取并存储在缓冲区中的字节数。 缺省情况下,这至少会读取一个字节,或者返回-1以指示数据已结束。

5 .向套接字通道(通道)写入数据

socketChannel.write(buffer );

该方法尝试将ByteBuffer作为参数,将缓冲区中的剩余字节写入通道。

----------------

ByteBuffer俗称缓冲区,是将数据移出通道的唯一方法,只能创建独立的基本类型的缓冲区,或使用" as "方法从ByteBuffer中检索。 ByteBuffer包含字节,必须使用Charset将其转换为字符串。 Charset是字符编码,提供了将字节流转换(解码)为字符串或将字符串转换(编码)为字节流的方法。

将private byte [ ] getbytes (char [ ] chars )//字符转换为字节(编码)

charset cs=charset.forname (utf-8 );

charbuffercb=char buffer.allocate (chars.length );

CB.put(chars;

cb.flip (;

bytebufferbb=cs.encode(CB ) )。

return bb.array (;

}

将private char [ ] getchars (byte [ ] bytes )//字节转换为字符(解码)

charset cs=charset.forname (utf-8 );

bytebufferbb=byte buffer.allocate (bytes.length );

b.put(bytes );

bb.flip (;

charbufferCB=cs.decode(bb );

return cb.array (;

}

可以从三个类: FileInputStream、FileOutputStream和RandomAccessFile生成通道或文件通道。 例如,filechannelfc=new file inputstream (与通道交互的典型方式是使用缓冲器,通道例如可以是煤矿(数据区域) )。 如将缓冲器作为运煤车,一般不直接将煤炭作为煤矿获取,而是通过运煤车获取。 用户需要几个步骤才能获得数据。

一.用户与ByteBuffer的交互

用两种方法将数据输入ByteBuffer,但都必须指定ByteBuffer的容量

bytebufferbuff=byte buffer.allocate (bsize );

a ) buff=byte buffer.wrap (askjfasjkf '.getbytes () )注: wrap方法是静态函数,只能接收byte类型的数据。 其他类型的数据需要类型转换才能以这种方式传递。

b ) buff.put ); buff.putChar(chars、buff.putDouble(double等)可以根据数据类型进行调整

二.文件通道和ByteBuffer的相互作用:

缓冲区向通道输入数据

filechannelfc=new file inputstream ().getChannel );

fc.write(buff );

fc.close (;

三.用户与ByteBuffer对话

通道向缓冲区发送数据

filechannelfc=new file output stream ().getChannel );

fc.read(buff );

fc.flip (;

四、向用户提示(三方式) ) ) ) ) ) ) ) ) ) ) )四) ) ) ) )四) ) )三) )四) ) )四)四) ) )五)六)六)二)六)五)六)六)六)

1 ) string encoding=system.getproperty (' file.encoding );

system.out.println (编码使用编码: ' charset.forname (encoding ).decode ) buff );

2 ) system.out.println (buff.ascharbuffer (); //对于此输出,输入时必须对getbytes(utf-8 ) )进行编码

3 ) system.out.println (buff.ascharbuffer (); 从CharBuffer向ByteBuffer输入buff.asCharBuffer ().put。

fc.rewind (;

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。