当前位置: 移动技术网 > IT编程>开发语言>Java > NIO的缓冲区(一)

NIO的缓冲区(一)

2020年07月18日  | 移动技术网IT编程  | 我要评论

NIO的缓冲区 Buffer

平时项目中很少用到NIO,时间久了也就忘记,写这篇博客仅仅是方便以后的复习。

java的IO是面向流的,而现在NIO(Java New I/O(NIO))是面向缓冲区的,简单学习一下java.nio包下的Buffer

在这里插入图片描述

在这里插入图片描述
position:下一个要被读或写的元素的索引,默认为0
capacity:容量,缓冲区能够容纳的数据元素的最大数量
limit:上界,缓冲区的第一个不能被读或写的元素
mark:标记,一个备忘位置,默认位置为-1

在这里插入图片描述
在这里插入图片描述
Buffer类的常见方法
在这里插入图片描述

ByteBuffer常见方法:
在这里插入图片描述

//创建一个新的缓冲区
        ByteBuffer buffer = ByteBuffer.allocate(10);

再来看看allocate()方法

public static ByteBuffer allocate(int capacity) {
        if (capacity < 0)
            throw new IllegalArgumentException();
            //返回容量和limit是capacity的ByteBuffer
        return new HeapByteBuffer(capacity, capacity);
    }

这个方法很简单的,静态的,如果容量小于0,就抛出异常,否则返回 HeapByteBuffer,再来看看 HeapByteBuffer

//一个内部类,继承ByteBuffer
class HeapByteBuffer
    extends ByteBuffer
{

    // For speed these fields are actually declared in X-Buffer;
    // these declarations are here as documentation
    /*

    protected final byte[] hb;
    protected final int offset;

    */
//构造方法
    HeapByteBuffer(int cap, int lim) {            // package-private

        super(-1, 0, lim, cap, new byte[cap], 0);
        /*
        hb = new byte[cap];
        offset = 0;
        */




    }

    HeapByteBuffer(byte[] buf, int off, int len) { // package-private

        super(-1, off, off + len, buf.length, buf, 0);
        /*
        hb = buf;
        offset = 0;
        */
    }

//向缓冲区插入数据
buffer.put("hello".getBytes());

执行以下代码

public static void main(String[] args) {
        //创建一个新的缓冲区
        ByteBuffer buffer = ByteBuffer.allocate(10);
        buffer.put("hello".getBytes());
        System.out.println(buffer.capacity());
        System.out.println(buffer.limit());
        System.out.println(buffer.position());
    }

输出:
在这里插入图片描述
可见该缓冲区的容量是10,limit是10,position是5

在这里插入图片描述
在这里插入图片描述
位置被设为0,而且容量和上界被设为10,刚好经过缓冲区能够容纳的最后一个字节。标记最初未定义。容量是固定的,但另外的三个属性可以在使用缓冲区时改变。

public static void main(String[] args) {
        //创建一个新的缓冲区
        ByteBuffer buffer = ByteBuffer.allocate(10);
        buffer.put("hello".getBytes());
        System.out.println(buffer.capacity());
        System.out.println(buffer.limit());
        System.out.println(buffer.position());


        System.out.println("==============");
        //position(2) 设置这个缓冲区的位置。
        //mark()将此缓冲区的标记设置在其位置。
        System.out.println(buffer.position(2).mark());//此时 position为2,mark也为2
        System.out.println(buffer.capacity());
        System.out.println(buffer.limit());
        System.out.println(buffer.position());
        System.out.println("==============");

        //将此缓冲区的位置重置为先前标记的位置,此时position=2,之前标记的位置为2
        buffer.reset();
        System.out.println(buffer.capacity());
        System.out.println(buffer.limit());
        System.out.println(buffer.position());
        System.out.println("==============");
    }

在这里插入图片描述

 public static void main(String[] args) {
        //创建一个新的缓冲区
        ByteBuffer buffer = ByteBuffer.allocate(10);
        buffer.put("hello".getBytes());
        System.out.println(buffer.capacity());
        System.out.println(buffer.limit());
        System.out.println(buffer.position());
        System.out.println("==============");

        byte b = buffer.get();
        byte b1 = buffer.get(0);
        System.out.println(b);
        System.out.println(b1);
    }

在这里插入图片描述
可见put之后直接调用get()方法是无法获取的,此时的position位置是5,没有值的

 buffer.rewind();//将position设置为最开始位置,limit不变
        System.out.println("=============");
        System.out.println(buffer.capacity());
        System.out.println(buffer.limit());
        System.out.println(buffer.position());
        byte b2 = buffer.get();
        System.out.println(b2);

在这里插入图片描述

 buffer.flip();//将position设置为最开始位置,limit也变
        System.out.println("=============");
        System.out.println(buffer.capacity());
        System.out.println(buffer.limit());
        System.out.println(buffer.position());
        byte b2 = buffer.get();
        System.out.println(b2);

在这里插入图片描述
写到现在可以得出Buffer是个属性直接的关系了
0 <= mark <= position <= limit <= capacity

本文地址:https://blog.csdn.net/weixin_43481793/article/details/107405895

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网