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());
    }
}

NIO学习 深入学习Bytebuffer_i++

字符串与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");
    }
}

处理黏包半包问题

NIO学习 深入学习Bytebuffer_垃圾回收机制_02

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();
    }
}