Nio flip()方法,position limit capacity

    xiaoxiao2022-07-06  193

    代码: FileInputStream fileInputStream = new FileInputStream("test1.txt"); FileChannel channel = fileInputStream.getChannel(); ByteBuffer byteBuffer = ByteBuffer.allocate(20); System.out.println("--------初始化完成--------------"); System.out.println("capacity:" + byteBuffer.capacity()); System.out.println("limit:" + byteBuffer.limit()); System.out.println("position:" + byteBuffer.position()); channel.read(byteBuffer); System.out.println("--------第一次读取数据完成后值--------------"); System.out.println("capacity:" + byteBuffer.capacity()); System.out.println("limit:" + byteBuffer.limit()); System.out.println("position:" + byteBuffer.position()); byteBuffer.flip(); System.out.println("--------第一次读取数据后,第一次flip()后值--------------"); System.out.println("capacity:" + byteBuffer.capacity()); System.out.println("limit:" + byteBuffer.limit()); System.out.println("position:" + byteBuffer.position()); while (byteBuffer.remaining() > 0){ System.out.println(byteBuffer.get()); } byteBuffer.flip(); System.out.println("--------第一次读取数据后,第二次flip()后值--------------"); System.out.println("capacity:" + byteBuffer.capacity()); System.out.println("limit:" + byteBuffer.limit()); System.out.println("position:" + byteBuffer.position()); FileInputStream fileInputStream1 = new FileInputStream("test2.txt"); FileChannel channel1 = fileInputStream1.getChannel(); channel1.read(byteBuffer); System.out.println("--------第二次读取数据后值--------------"); System.out.println("capacity:" + byteBuffer.capacity()); System.out.println("limit:" + byteBuffer.limit()); System.out.println("position:" + byteBuffer.position()); byteBuffer.flip(); System.out.println("--------第二次读取数据后,第一次flip()后值--------------"); System.out.println("capacity:" + byteBuffer.capacity()); System.out.println("limit:" + byteBuffer.limit()); System.out.println("position:" + byteBuffer.position()); while (byteBuffer.remaining() > 0){ System.out.println(byteBuffer.get()); } byteBuffer.flip(); System.out.println("--------第二次读取数据后,flip()后值--------------"); System.out.println("capacity:" + byteBuffer.capacity()); System.out.println("limit:" + byteBuffer.limit()); System.out.println("position:" + byteBuffer.position()); byteBuffer.clear(); System.out.println("--------clear()后值--------------"); System.out.println("capacity:" + byteBuffer.capacity()); System.out.println("limit:" + byteBuffer.limit()); System.out.println("position:" + byteBuffer.position()); 输出: --------初始化完成-------------- capacity:20 limit:20 position:0 --------第一次读取数据完成后值-------------- capacity:20 limit:20 position:8 --------第一次读取数据后,第一次flip()后值-------------- capacity:20 limit:8 position:0 97 98 99 100 101 102 103 104 --------第一次读取数据后,第二次flip()后值-------------- capacity:20 limit:8 position:0 --------第二次读取数据后值-------------- capacity:20 limit:8 position:8 --------第二次读取数据后,第一次flip()后值-------------- capacity:20 limit:8 position:0 122 121 120 104 103 102 101 100 --------第二次读取数据后,flip()后值-------------- capacity:20 limit:8 position:0 --------clear()后值-------------- capacity:20 limit:20 position:0

     

    public final Buffer flip() { limit = position; position = 0; mark = -1; return this; } public final Buffer clear() { position = 0; limit = capacity; mark = -1; return this; }

    总结:

        capacity:指定后大小不会变化

       position: 根据读取的数据长度变化,第一次读取后,长度为数据长度(8),flip()后,长度变为0 ,从0开始写出数据,第二次读取数据,则不能完成读取,只能读取与第一次数据长度相同的数据(8,实际第二次的数据长度为11)

         limit:初始化长度与capacity相同,第一次读取数据,flip() 执行limit = position, 写出数据后,第二次读取数据,limit限制了读取数据的长度

    如果需要第二次完整读取数据,需要clear将所有属性重置

    最新回复(0)