zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Visual Studio Code必备插件
    webpack4+:. css属性自动追加前缀 与 mini-css-extract-plugin 插件 打包冲突问题
    webpack4.x抽取css【extract-text-webpack-plugin与mini-css-extract-plugin】
    javaScript中slice, substring,substr三者区别以及用法扩展
    Spring Boot实践——Mybatis分页插件PageHelper的使用
    Nginx配置详解
    Maven的几个常用plugin
    excel拼接数据宏
    我的Linux之路——windows10用WMware安装CentOS7.5 虚拟机详细步骤
    Spring Boot实践——多线程
  • 原文地址:https://www.cnblogs.com/guoyansi19900907/p/10961150.html
Copyright © 2011-2022 走看看