Как объединить 2 ByteBufs? - PullRequest
       9

Как объединить 2 ByteBufs?

0 голосов
/ 03 сентября 2018

Я пытаюсь объединить 2 ByteBufs в один ByteBuf, как я могу это сделать?

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import org.apache.commons.lang3.ArrayUtils;

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        ByteBuf a = Unpooled.buffer(4).writeByte(33).writeByte(44).writeByte(55).writeByte(66);
        ByteBuf b = Unpooled.buffer(4).writeByte(77).writeByte(88).writeByte(99).writeByte(22);

        byte[] byteArray = new byte[4];
        a.readBytes(byteArray);

        System.out.println(Arrays.toString(ArrayUtils.addAll(byteArray, b.array())));
        System.out.println(Arrays.toString(
                Unpooled.copiedBuffer(a, b).array()
        ));
    }
}

Код выше печатает

[33, 44, 55, 66, 77, 88, 99, 22]

[77, 88, 99, 22]

Я могу легко объединять байтовые массивы, но я не могу объединить ByteBufs, я не могу вызвать метод ByteBuf.array () и создать новый ByteBuf с объединенными байтовыми массивами в процессе производства (я получаю UnsupportedOperationException: direct buffer при вызове array() так)

1 Ответ

0 голосов
/ 03 сентября 2018

Это происходит потому, что ваш код уже прочитал все четыре байта a:

a.readBytes(byteArray);

В этот момент индекс чтения a находится за концом данных, поэтому ни один из его байтов не копируется.

Размещение кода для копирования буфера перед чтением устраняет проблему:

System.out.println(Arrays.toString(
        Unpooled.copiedBuffer(a, b).array()
));
byte[] byteArray = new byte[4];
a.readBytes(byteArray);
System.out.println(Arrays.toString(ArrayUtils.addAll(byteArray, b.array())));

В качестве альтернативы вы можете вызвать a.resetReaderIndex() после readBytes, чтобы "перемотать" буфер обратно в начало.

...