zoukankan      html  css  js  c++  java
  • 读取ByteBuffer有效的数据

    转:https://zhidao.baidu.com/question/427134449349230532.html

    说道 ByteBuffer的缓冲区,就需要知道缓冲区的的三个状态

    1)capacity 即容量,也就是缓冲区的大小。它的值是在创建缓冲区的时候指定的,设定后无法对其进行修改。
    2)limit 读写限制:也就是缓冲区可以利用(进行读写)的范围的最大值,可以调用ByteBuffer对象的limit(int)方法进行设置,
    调用ByteBuffer对象的limit()获取缓冲区读写限制的大小;在刚开始创建缓冲区的时候limit的大小等于capacity。
    3)position 读写位置:表示当前进行读写操作时的位置,初始化为0,即缓冲区开始读或者写数据的位置。
    可以通过调用ByteBuffer对象的positon(int)方法设置它的值,通过position()可以获取它的值

    这三个状态的数值满足一下关系:0=<position=<limit=<capacity

    在初始化缓冲区的情况下,position=0;limit = capacity

    缓冲区是通过put或者putXXX来向缓冲区添加数据,也可以通过put(index,vlaue)方法在指定的position和limit之间指定的地方添加数据;
    通过get()或者getXXX()来获取数据,也可以通过get(int index)方法来获取position到limit之间指定的数据。
    注意position的位置会随着数据的写入而移或者读取一个字节一个字节的移动(比如添加一个byte类型的数据position会+1,
    添加一个int类型的数据position会+4;),直到position=limit为止。如果position==limit时,
    再添加数据会报java.nio.BufferOverflowException、再获取数据会报java.lang.IndexOutOfBoundsException。
    正因为向缓冲区添加数据的时候写数据的时候position会变化,如果想获取缓冲区的数据直接调用get等相关方法获取数据是肯定不行的,
    因为此时数据在缓冲区存在数据的部分是0~~position之间,而读数据开始的位置position在此区间之外。
    所以要获取此区间的数据需要重新设置position的位置,ByteBuffer提供了一个flip方法,
    该方法主要进行两部操作 limit = position;(将limit设为当前position) position =0;
    此时通过get方法就可以获取到0到limit之间的数据了

    以下代码修改至 http://www.cnblogs.com/guazi/p/6474757.html
    public static void main(String[] args) {
            ByteBuffer buff = ByteBuffer.allocate(1024);
            String str = "helloWorld";
            buff.put(str.getBytes());
            System.out.println(new String(buff.array()));
            System.out.println("position:" + buff.position() + "	 limit:"
                    + buff.limit() + "	 capacity:" + buff.capacity());
            // 读取两个字节byte[] abytes = new byte[1];
            byte[] abytes = new byte[1];
            buff.get(abytes);
            System.out.println("get one byte to string:" + new String(abytes));
            // Reads the byte at this buffer's current position, and then increments
            // the position.
            buff.get();
            System.out.println("获取两个字节(两次get()方法调用)后");
            System.out.println("position:" + buff.position() + "	 limit:"
                    + buff.limit());
            // Sets this buffer's mark at its position. like
            // ByteBuffer.this.mark=position
            buff.mark();
            System.out.println("mark()...");
            System.out.println("position:" + buff.position() + "	 limit:"
                    + buff.limit());
    
            // 当读取到码流后,进行解码。首先对ByteBuffer进行flip操作,
            // 它的作用是将缓冲区当前的limit设置为position,position设置为0
            // flip方法将Buffer从写模式切换到读模式。调用flip()方法会将position设回0,并将limit设置成之前position的值。
            buff.flip();
            System.out.println("flip()...");
            System.out.println("position:" + buff.position() + "	 limit:"
                    + buff.limit() + "	 capacity:" + buff.capacity());
    
            byte[] tbyte = new byte[buff.limit()];
            buff.get(tbyte);
            System.out.println("get one byte to string:" + new String(tbyte));
            System.out.println("position:" + buff.position() + "	 limit:"
                    + buff.limit());
            if (buff.hasRemaining()) {
                buff.compact();
            } else {
                buff.clear();
            }
        }
    
    

     还有几个关于这个的,感觉写的还可以:

    http://blog.csdn.net/shuaiawp/article/details/51915983

    http://www.cnblogs.com/xiaoluo501395377/archive/2012/10/30/2747001.html

     
  • 相关阅读:
    【USACO18JAN】MooTube G
    【JSOI2008】星球大战
    【ECF#87】小结
    【NOIP2013】火柴排队
    【USACO04OPEN】MooFest G
    【NOI OL #2】T3 游戏
    【NOI OL #2】T2 子序列问题
    简单NLT
    python中的位运算
    列表和元组
  • 原文地址:https://www.cnblogs.com/jiduoduo/p/6535217.html
Copyright © 2011-2022 走看看