繁体   English   中英

将字节从一个ByteBuffer传输到另一个ByteBuffer

[英]transferring bytes from one ByteBuffer to another

将ByteBuffer bbuf_src尽可能多的字节放入另一个ByteBuffer bbuf_dest (以及知道传输了多少字节)的最有效方法是什么? 我正在尝试使用bbuf_dest.put(bbuf_src)但它似乎想抛出一个BufferOverflowException,当我需要它时,我现在无法从Sun获取javadoc(网络问题)。 > :(唉。


编辑:darnit,@ Richard的方法(使用来自bbuf_src支持数组的put())如果bbuf_src是ReadOnly缓冲区将无效,因为您无法访问该数组。 在那种情况下我该怎么办?

正如您所发现的那样,获取后备阵列并不总是有效(对于只读缓冲区,直接缓冲区和内存映射文件缓冲区,它会失败)。 更好的选择是复制源缓冲区并为要传输的数据量设置新的限制:

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);

好的,我改编了@ Richard的回答:

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;
}

并进行测试以确保其有效:

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;
}

你得到BufferOverflowException,因为你的bbuf_dest不够大。

您需要使用bbuf_dest.remaining()来查找可以从bbuf_src传输的最大字节数:

int maxTransfer = Math.min(bbuf_dest.remaining(), bbuf_src.remaining());
bbuf_dest.put(bbuf_src.array(), 0, maxTransfer);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM