在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 (;