简体   繁体   English

Concat在Java中使用两个ByteBuffers

[英]Concat two ByteBuffers in Java

How can I concat two ByteBuffers to one ByteBuffer? 如何将两个ByteBuffers连接到一个ByteBuffer?

The following doesn't work: 以下不起作用:

    ByteBuffer bb = ByteBuffer.allocate(100);
    ByteBuffer bb2 = ByteBuffer.allocate(200);
    bb.allocate(200).put(bb2);
    System.out.println(bb.array().length);

The length of bb is still 100 . bb的长度仍为100

Something like 就像是

bb = ByteBuffer.allocate(300).put(bb).put(bb2);

should do the job: Create a buffer that is large enough to hold the contents of both buffers, and then use the relative put-methods to fill it with the first and the second buffer. 应该做的工作:创建一个足够大的缓冲区来保存两个缓冲区的内容,然后使用相对的put方法用第一个和第二个缓冲区填充它。 (The put method returns the instance that the method was called on, by the way) (顺便说一下, put方法返回调用方法的实例)

We'll be copying all data. 我们将复制所有数据。 Remember that this is why string concatenation is expensive! 请记住,这就是为什么字符串连接很昂贵!

public static ByteBuffer concat(final ByteBuffer... buffers) {
    final ByteBuffer combined = ByteBuffer.allocate(Arrays.stream(buffers).mapToInt(Buffer::remaining).sum());
    Arrays.stream(buffers).forEach(b -> combined.put(b.duplicate()));
    return combined;
}

you can use the method here 你可以在这里使用这个方法

https://github.com/ata4/ioutils/blob/047e401d73c866317af2e12f7803b3ee43eec80a/src/main/java/info/ata4/io/buffer/ByteBufferUtils.java#L289 https://github.com/ata4/ioutils/blob/047e401d73c866317af2e12f7803b3ee43eec80a/src/main/java/info/ata4/io/buffer/ByteBufferUtils.java#L289

and for example: 例如:

  ByteBuffer concat() {
int length = 0;
for (ByteBuffer bb : buffers) {
  bb.rewind();
  length += bb.remaining();
}
ByteBuffer bbNew = ByteBuffer.allocateDirect((int) length);

// put all buffers from list
for (ByteBuffer bb : buffers) {
  bb.rewind();
  bbNew.put(bb);

}
bbNew.rewind();
return bbNew;
}

Probably because on line3 ie bb.allocate(200).put(bb2); 可能是因为在bb.allocate(200).put(bb2);上,即bb.allocate(200).put(bb2); ,

bb.allocate(200) is returning a new Byte buffer (See https://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#allocate(int) ). bb.allocate(200)返回一个新的字节缓冲区(参见https://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#allocate(int) )。 That is not actually changing bb itself. 这实际上并没有改变bb本身。 So its still the bytebuffer of capacity 100 from line1. 所以它仍然是line1的容量100的字节缓冲区。

Try the following code: 请尝试以下代码:

//store both ByteBuffer object as an array
byte[] array1 = ByteBuffer.allocate(100).array();
byte[] array2 = ByteBuffer.allocate(200).array();

//create a ByteBuffer which is big enough
ByteBuffer bigenough = ByteBuffer.allocate(array1.length + array2.length);

//put the two arrays in one ByteBuffer
ByteBuffer after1 = bigenough.put(array1, 0, array1.length);
ByteBuffer result = after1.put(array2, array1.length, array2.length);

//print the length of the combined array.
System.out.println(result.array().length);

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

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