大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
在NIO中,数据的读写操作始终是与缓冲区相关联的(读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓冲区)
缓冲区是定长的,基本上它只是一个列表,它的所有元素都是基本数据类型(String并未包含其中,但是String. getBytes就可以了).
Nio缓冲区的7种形式
ByteBuffer
ShortBuffer
在ByteBuffer的属性中:有以下3种常见属性
m:mark:初始值为-1,标记索引地点
p:position:初始值为0,索引下标
l:limit:最好定义成bytebuffer的长度,即允许可读空间长度
c:capacity:缓冲区能容纳的数据元素的最大数量,创建之后无法被改变
总的关系m
1.
1.1 使用allocate()静态方法
//创建一个容量为256字节的ByteBuffer,
ByteBuffer buffer=ByteBuffer.allocate(256);
创建其他缓冲区也是这样的静态方法创建的Buffer父类引用对象 。
1.2 通过包装一个已有的数组来创建如下,通过包装的方法创建的缓冲区保留了被包装数组内保存的数据.
// wrap(int[] array, int offset, int length)
无论要使用的子数组的偏移量offset ,还是子数组的长度length ,使用这个方法的过程都是缓冲整个数组的过程。
而且buffer与数组创建强耦合联系,数据改变则缓冲区值也会改变,反之亦然
//String news = new String(sendBuffer.array(), cs);
注释里的方法也是可行,只是要注意array()方法不是将ByteBuffer中position到limit段的byte[]数组输出,而是输出缓存区所有的byte[]数组!包括limit之后的!
2.回绕缓冲区
byte[] data = new byte[buffer.remaining()];
//
3.清除缓冲区
以下为常用方式
4.从套接字通道(信道)读取数据
ByteBuffer.clear();
SocketChannel.read(ByteBuffer);
执行以上方法后,通道会从socket读取的数据填充此缓冲区,它返回成功读取并存储在缓冲区的字节数.在默认情况下,这至少会读取一个字节,或者返回-1指示数据结束.
read之后,通常就是开始从ByteBuffer中提取读到的数据,如果你的数据是以自己定义的数据包的格式进行发送的,那你还需要判断是否读到了数据包的结尾,因为对流数据本身来说是没有结尾这一说的。在提取数据之前,要先把position放到开始读取时的位置,把limit放到当前位置,所以要flip一下,表示从position到limit的位置都是需要的数据。
ByteBuffer.flip();
while(ByteBuffer.hasRemaining()){
}
这样以来也存在一个问题,当一次读到的ByteBuffer不包含完整的数据包或者包含多个数据包.那么就需要在下一次继续把这些包分拆出来.那么在读取数据的代码处就可以改为,这样就把之前读取到的未完整的包保留了下来:
if(!ByteBuffer.hasRemaining){
}
另外一个可能会用到的操作就是ByteBuffer.rewind(),他会把position置为0,limit保持不变,可以用于重复读取一段数据.
5.向套接字通道(信道)写入数据
6.将ByteBuffer与字符的互转
private byte[] getBytes (char[] chars) {//将字符转为字节(编码)
}
private char[] getChars (byte[] bytes) {//将字节转为字符(解码)
Charset cs = Charset.forName (“UTF-8”);
ByteBuffer bb = ByteBuffer.allocate (bytes.length);
bb.put (bytes);
bb.flip ();
CharBuffer cb = cs.decode (bb);
return cb.array();
}
7. put()方法远比想象的强大
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/186833.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...