欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

NIO的缓冲区原理

程序员文章站 2022-06-28 18:41:21
NIO的缓冲区 Buffer平时项目中很少用到NIO,时间久了也就忘记,写这篇博客仅仅是方便以后的复习。java的IO是面向流的,而现在NIO(Java New I/O(NIO))是面向缓冲区的,简单学习一下java.nio包下的Bufferposition:下一个要被读或写的元素的索引,默认为0capacity:容量,缓冲区能够容纳的数据元素的最大数量limit:上界,缓冲区的第一个不能被读或写的元素mark:标记,一个备忘位置,默认位置为-1Buffer类的常见方法ByteBu...

NIO的缓冲区 Buffer

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

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

NIO的缓冲区原理

NIO的缓冲区原理
position:下一个要被读或写的元素的索引,默认为0
capacity:容量,缓冲区能够容纳的数据元素的最大数量
limit:上界,缓冲区的第一个不能被读或写的元素
mark:标记,一个备忘位置,默认位置为-1

NIO的缓冲区原理
NIO的缓冲区原理
Buffer类的常见方法
NIO的缓冲区原理

ByteBuffer常见方法:
NIO的缓冲区原理

//创建一个新的缓冲区
        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());
    }

输出:
NIO的缓冲区原理
可见该缓冲区的容量是10,limit是10,position是5

NIO的缓冲区原理
NIO的缓冲区原理
位置被设为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("==============");
    }

NIO的缓冲区原理

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

NIO的缓冲区原理
可见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);

NIO的缓冲区原理

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

NIO的缓冲区原理
写到现在可以得出Buffer是个属性直接的关系了
0 <= mark <= position <= limit <= capacity

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

相关标签: 学习