如何从较大的ByteBuffer中读取较小的ByteBuffer?

时间:2014-02-18 15:14:28

标签: java bytebuffer

虽然存在ByteBuffer.put(ByteBuffer)方法,但似乎缺少ByteBuffer.get(ByteBuffer)?我应该如何从较大的ByteBuffer中读取较小的ByteBuffer

3 个答案:

答案 0 :(得分:1)

考虑阅读API page for ByteBuffer

ByteBuffer get(byte[])

ByteBuffer get(byte[] dst, int offset, int length)

答案 1 :(得分:1)

存在ByteBuffer#put方法:

  

public ByteBuffer put(ByteBuffer src):此方法将给定源缓冲区中剩余的字节传输到此缓冲区

您正在寻找类似

的内容
  

public ByteBuffer get(ByteBuffer dst):此方法将此缓冲区中剩余的字节传输到给定的目标缓冲区

但请注意,操作getput有点对称。

ByteBuffer src = ...
ByteBuffer dst = ...
//src.get(dst); // Does not exist
dst.put(src); // Use this instead

您明确谈到了较小的较大的缓冲区。所以我假设dst缓冲区小于src缓冲区。在这种情况下,您可以相应地设置源缓冲区的限制:

ByteBuffer src = ...
ByteBuffer dst = ...
int oldLimit = src.limit();
src.limit(src.position()+dst.remaining());
dst.put(src);
src.limit(oldLimit);

替代配方是可能的(例如使用原始缓冲区的ByteBuffer#slice())。但无论如何,必须将缓冲区内容复制到新的字节数组中,只是为了将其传输到另一个缓冲区中!

答案 2 :(得分:0)

如果我理解正确,您只需要将byte[]重新包装到新的ByteBuffer中。

ByteByffer buffer = ...;
byte[] sub = new byte[someSize];
buffer.get(sub [, ..]); // use appropriate get(..) method
buffer = ByteBuffer.wrap(sub);