NIO学习 深入学习Bytebuffer
转载
NIO学习 深入学习Bytebuffer
两种分配空间方法
public class TestByteBuffer2 {
public static void main(String[] args) {
//java堆内存 效率较低 受垃圾回收机制影响
System.out.println(ByteBuffer.allocate(10).getClass());
//直接内存 效率高 不受垃圾回收机制影响 但是分配内存性能低 使用不当会导致内存泄漏
System.out.println(ByteBuffer.allocateDirect(10).getClass());
}
}
字符串与ByteBuffer互转
public class TestByteBufferString {
public static void main(String[] args) {
//方法一
ByteBuffer buffer = ByteBuffer.allocate(16);
buffer.put("hello".getBytes(StandardCharsets.UTF_8));
//方法二 更推荐
ByteBuffer buffer1 = StandardCharsets.UTF_8.encode("hello");
}
}
处理黏包半包问题
public class TestByteBuffer3 {
public static void main(String[] args) {
ByteBuffer source = ByteBuffer.allocate(32);
source.put("Hello,World\nI am ZhangSan\nHo".getBytes(StandardCharsets.UTF_8));
split(source);
source.put("w are you?\n".getBytes(StandardCharsets.UTF_8));
split(source);
}
private static void split(ByteBuffer source){
source.flip();//切读模式
for(int i = 0; i < source.limit(); i++){
//找到一条完整信息
if(source.get(i) == '\n'){
int length = i + 1 - source.position();
ByteBuffer target = ByteBuffer.allocate(length);
//从source读 往target写
for(int j = 0; j < length; j++){
target.put(source.get());
}
target.flip();
while (target.hasRemaining()){
byte b = target.get();
System.out.print((char) b);
}
System.out.println();
target.clear();
}
}
source.compact();
}
}
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。