7天掌握NIO,没错只需7天,第一天----put和get方法

import java.lang.reflect.Method;
import java.nio.ByteBuffer;
import java.nio.LongBuffer;

public class test_02 {
    public final static int MAX_SIZE = 2000;


    public static void main (String[] args) throws Exception {
        //直接缓冲区:开启和释放时间成本较高,适合保存易受操作系统本机I/O操作影响的大量,长时间保存的数据
        //创建方法:
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(MAX_SIZE);
        //非直接缓冲区,
        //创建方法:
        ByteBuffer byteBuffer1 = ByteBuffer.allocate(MAX_SIZE);




        //性能比较:
        //直接缓冲区性能稍微高一点
        byteBuffer=ByteBuffer.allocateDirect(MAX_SIZE);


        Long beginTime = System.currentTimeMillis();
        for (int i = 0 ; i < MAX_SIZE ; i++){
            byteBuffer.put((byte)123456789);
        }
        Long endTime = System.currentTimeMillis();
        System.out.println("直接缓冲区用时:");
        System.out.println(endTime - beginTime);


        byteBuffer1 = ByteBuffer.allocate(MAX_SIZE);
        beginTime = System.currentTimeMillis();
        for (int i = 0 ; i < MAX_SIZE ; i++){
            byteBuffer1.put((byte)123456789);
        }
        endTime = System.currentTimeMillis();
        System.out.println("非直接缓冲区用时:");
        System.out.println(endTime - beginTime);

        //释放内存:
        //手动释放:
        Method cleanerMethod = byteBuffer.getClass().getMethod("cleaner");
        cleanerMethod.setAccessible(true);
        Object returnValue = cleanerMethod.invoke(byteBuffer);

        Method cleanMethod = returnValue.getClass().getMethod("clean");
        cleanMethod.setAccessible(true);
        cleanMethod.invoke(returnValue);

        //JVM自动回收内存:进程结束后,JVM在某个时机触发垃圾回收器进行内存的回收




        //wrap方法wrap(byte[] array,int offset , int length),偏移量,长度
        byte[] bytes = new byte[]{1,2,3,4,5,6,7,8,9};
        ByteBuffer byteBuffer2 = ByteBuffer.wrap(bytes,2,4);
        while (byteBuffer2.remaining()>0){
            System.out.println(byteBuffer2.get());
        }
        //输出:3 4 5 6

        //put和get方法
        //put方法
        byte[] bytes1 = new byte[]{1,2,3,4,5,6,7,8,9,10};
        byte[] bytes2 = new byte[]{11,22,33,44,55};
        ByteBuffer byteBuffer3 = ByteBuffer.allocate(10);
        byteBuffer3.put(bytes1);
        byteBuffer3.rewind();
        while (byteBuffer3.remaining()>0){
            System.out.printf("%d ",byteBuffer3.get());
        }
        System.out.println("\n");

        //从当前position位置开始加入,从加入数组的offset开始加,加length个,异常什么都不传输,因为是先判断的
        byteBuffer3.position(2);
        byteBuffer3.put(bytes2,2,3);
        byteBuffer3.rewind();
        while (byteBuffer3.remaining()>0){
            System.out.printf("%d ",byteBuffer3.get());
        }

        //get方法
        System.out.println("\n");
        byte[] bytes3 = new byte[byteBuffer3.capacity()];

        //从Buffer的position开始输出,加入到数组的offset开始,一共加length个,异常什么都不传输,因为是先判断的
        byteBuffer3.position(2);
        byteBuffer3.get(bytes3,3,4);
        for (int i = 0; i < bytes3.length ; i++) {
            System.out.print(bytes3[i]+" ");
        }


        System.out.println("\n");
        
        
        
        //putType和getType方法
        ByteBuffer byteBuffer4 = ByteBuffer.allocate(100);
        byteBuffer4.putChar('a');//char两个个字节,占0-1
        byteBuffer4.putChar('b');//2-3

        byteBuffer4.position(4);
        byteBuffer4.putDouble(1.1);//double占8个字节,4-11
        byteBuffer4.putDouble(2.2);//12-19

        byteBuffer4.position(20);
        byteBuffer4.putFloat(3.3F);//float占4个字节 20-23
        byteBuffer4.putFloat(4.4F);//24-27

        byteBuffer4.position(28);
        byteBuffer4.putInt(1);//int占4个字节28-31
        byteBuffer4.putInt(2);//32-35

        byteBuffer4.position(36);
        byteBuffer4.putLong(4L);//long占8个字节 36-43
        byteBuffer4.putLong(5L);//44-51

        byteBuffer4.position(52);
        byteBuffer4.putShort((short) 1);//short占2个字节 52-53
        byteBuffer4.putShort((short)2);//54-55

        byteBuffer4.position(0);
        byte[] bytesOut = byteBuffer4.array();

        for (int i = 0; i < bytesOut.length ; i++) {
            System.out.print(bytesOut[i]+" ");
        }

        System.out.println();
        System.out.println(byteBuffer4.getChar(0));
        System.out.println(byteBuffer4.getChar(2));
        System.out.println(byteBuffer4.getDouble(4));
        System.out.println(byteBuffer4.getDouble(12));
        System.out.println(byteBuffer4.getFloat(20));
        System.out.println(byteBuffer4.getFloat(24));
        System.out.println(byteBuffer4.getInt(28));
        System.out.println(byteBuffer4.getInt(32));
        System.out.println(byteBuffer4.getLong(36));
        System.out.println(byteBuffer4.getLong(44));
        System.out.println(byteBuffer4.getShort(52));
        System.out.println(byteBuffer4.getShort(54));
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值