NIO基础

问:什么是NIO?

答:对I/O的byte[]或char[]进行封装,采用ByteBuffer类来操作数据。简而言之就是:比I/O更牛逼的知识点;我们给这个知识点取名为NIO。

问:牛逼在哪?

答:多了一个缓冲区的概念.这样对byte[]或char[]这种数组的处理就更灵活了。

问:缓冲区怎么实现的?

答:jdk中有一个Buffer抽象类,这个抽象类中有七个实现类,同样是是抽象类;

他们分别是ByteBuffer,CharBuffer,DoubleBuffer,FloatBuffer,IntBuffer,LongBuffer,ShortBuffer.

这七个抽象类中都有一个静态的wrap方法,作用是将数组放入缓冲区中,来构建存储不同数据类型的缓冲区。

实例:

int[] intArray={1,2,3,4};
IntBuffer intBuffer=IntBuffer.wrap(intArray);

问:Buffer都提供了哪些核心的东西?

答:Buffer提供了四个字段来操作缓冲区。

capacity:容量

limit:限制

position:位置

mark:标记。

源码:

问:请介绍capacity?

答:缓冲区的元素数量;应为数组的元素数量是不能变得,所以capacity也是不能变得。但是可以用Buffer得capacity()方法获取元素。

int[] intArray={1,2,3,4};
IntBuffer intBuffer=IntBuffer.wrap(intArray);
System.out.println("intBuffer="+intBuffer.capacity());

问:请介绍limit?

缓冲区中限制第一个不能读取或写入得元素得索引(从0开始);由此可见limit不能为0,不能大于capacity.

实例:

int[] intArray={1,2,3,4};
IntBuffer intBuffer=IntBuffer.wrap(intArray);
System.out.println("capacity="+intBuffer.capacity());
System.out.println("默认limit:"+intBuffer.limit());
intBuffer.limit(2);
System.out.println(intBuffer.get(0));
System.out.println(intBuffer.get(1));
System.out.println(intBuffer.get(2));

执行到最后一行会报异常,因为超出了限制范围。

问:请介绍position?

答:读取到或者写入到元素得位置;

int[] intArray={1,2,3,4};
        IntBuffer intBuffer=IntBuffer.wrap(intArray);
        System.out.println("默认位置:"+intBuffer.position());
        intBuffer.position(2);//从2位置开始读取或写入
        System.out.println("修改后得位置:"+intBuffer.position());
        intBuffer.put(6);
        System.out.println("添加元素后得位置:"+intBuffer.position());
        for(int i=0;i<intArray.length;i++){
            System.out.print(intArray[i]+" ");
        }

问:market干什么得?

答:在market这个动作的时候记录这个position得值,后面无论position如何变动,只要执行reset()方法,就会把position设置成标记时候得market值。

没有market得缓冲区,reset()会抛异常。

int[] intArray={1,2,3,4};
        IntBuffer intBuffer=IntBuffer.wrap(intArray);
        intBuffer.position(2);
        intBuffer.mark();
        System.out.println("标记的position:"+intBuffer.position());//2
        intBuffer.position(3);
        System.out.println("变动后得position:"+intBuffer.position());//3
        intBuffer.reset();
        System.out.println("重置之后的position:"+intBuffer.position());//2
原文地址:https://www.cnblogs.com/guoyansi19900907/p/10961150.html