work hard work smart

专注于Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Java NIO Buffer详解

Posted on 2019-08-11 22:29  work hard work smart  阅读(277)  评论(0编辑  收藏  举报

一、ByteBuffer类型化的put与get方法

/**
 * ByteBuffer类型化的put与get方法
 */
public class NioTest5 {

    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(64);

        buffer.putInt(5);
        buffer.putLong(500000000L);
        buffer.putDouble(13.456);
        buffer.putChar('你');
        buffer.putShort((short) 3);

        buffer.flip();

        System.out.println(buffer.getInt());
        System.out.println(buffer.getLong());
        System.out.println(buffer.getDouble());
        System.out.println(buffer.getChar());
        System.out.println(buffer.getShort());
    }
}

  put和get的类型要一致。如第一个是putInt, 输出的使用第一个要用getInt。

 

二、Slice Buffer

/**
 * Slice Buffer和原Buffer共享底层数组,任一一个改变,另外一个也会改变
 */
public class NioTest6 {

    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(10);
        for(int i = 0; i < buffer.capacity(); ++i){
            buffer.put((byte)i);
        }

        buffer.position(2);
        buffer.limit(6);

        ByteBuffer sliceBuffer = buffer.slice();

        for(int i = 0; i < sliceBuffer.capacity(); ++i){
            byte b = sliceBuffer.get(i);
            b *= 2;
            sliceBuffer.put(i,  b);
        }

        buffer.position(0);
        buffer.limit(buffer.capacity());

       while (buffer.hasRemaining()){
           System.out.println(buffer.get());
       }
    }
}

  

三、只读Buffer

/**
 * 只读buffer,我们可以随时将一个普通Buffer调用asReadOnlyBuffer方法返回一个只读Buffer
 * 但不能将一个只读Buffer转换为读写Buffer
 */
public class NioTest7 {

    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(10);

        System.out.println(buffer.getClass());
        for(int i = 0; i < buffer.capacity(); ++i){
            buffer.put((byte)i);
        }

        ByteBuffer readonlyBuffer = buffer.asReadOnlyBuffer();
        System.out.println(readonlyBuffer.getClass());

        readonlyBuffer.position(0);
        readonlyBuffer.put((byte)2);


    }
}

  对只读Buffer进行修改,将抛出异常