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