transferring bytes from one ByteBuffer to another

前端 未结 3 1009
无人及你
无人及你 2021-01-02 23:41

What\'s the most efficient way to put as many bytes as possible from a ByteBuffer bbuf_src into another ByteBuffer bbuf_dest (as well as know how m

相关标签:
3条回答
  • 2021-01-03 00:30

    OK, I've adapted @Richard's answer:

    public static int transferAsMuchAsPossible(
                         ByteBuffer bbuf_dest, ByteBuffer bbuf_src)
    {
      int nTransfer = Math.min(bbuf_dest.remaining(), bbuf_src.remaining());
      if (nTransfer > 0)
      {
        bbuf_dest.put(bbuf_src.array(), 
                      bbuf_src.arrayOffset()+bbuf_src.position(), 
                      nTransfer);
        bbuf_src.position(bbuf_src.position()+nTransfer);
      }
      return nTransfer;
    }
    

    and a test to make sure it works:

    public static boolean transferTest()
    {
        ByteBuffer bb1 = ByteBuffer.allocate(256);
        ByteBuffer bb2 = ByteBuffer.allocate(50);
        for (int i = 0; i < 100; ++i)
        {
            bb1.put((byte)i);
        }
        bb1.flip();
        bb1.position(5);
        ByteBuffer bb1a = bb1.slice();
        bb1a.position(2);
        // bb3 includes the 5-100 range
        bb2.put((byte)77);
        // something to see this works when bb2 isn't empty
        int n = transferAsMuchAsPossible(bb2, bb1a);
        boolean itWorked = (n == 49);
    
        if (bb1a.position() != 51)
            itWorked = false;
        if (bb2.position() != 50)
            itWorked = false;
        bb2.rewind();
        if (bb2.get() != 77)
            itWorked = false;
        for (int i = 0; i < 49; ++i)
        {
            if (bb2.get() != i+7)
            {
                itWorked = false;
                break;
            }
        }
        return itWorked;
    }
    
    0 讨论(0)
  • 2021-01-03 00:35

    As you've discovered, getting the backing array doesn't always work (it fails for read only buffers, direct buffers, and memory mapped file buffers). The better alternative is to duplicate your source buffer and set a new limit for the amount of data you want to transfer:

    int maxTransfer = Math.min(bbuf_dest.remaining(), bbuf_src.remaining());
    // use a duplicated buffer so we don't disrupt the limit of the original buffer
    ByteBuffer bbuf_tmp = bbuf_src.duplicate ();
    bbuf_tmp.limit (bbuf_tmp.position() + maxTransfer);
    bbuf_dest.put (bbuf_tmp);
    
    // now discard the data we've copied from the original source (optional)
    bbuf_src.position(bbuf_src.position() + maxTransfer);
    
    0 讨论(0)
  • 2021-01-03 00:39

    You get the BufferOverflowException because your bbuf_dest is not big enough.

    You will need to use bbuf_dest.remaining() to find out the maximum number of bytes you can transfer from bbuf_src:

    int maxTransfer = Math.min(bbuf_dest.remaining(), bbuf_src.remaining());
    bbuf_dest.put(bbuf_src.array(), 0, maxTransfer);
    
    0 讨论(0)
提交回复
热议问题