String to ByteBuffer

195
02 июня 2018, 13:00

Мне нужно в сокет отправить строку. При этом, в пакете вначале должно идти длина пакета в байтах.

Пишу такой код

private static final CharsetEncoder encoder =
  Charset.forName("UTF-8").newEncoder();
......
String data = .........
CharBuffer buf = CharBuffer.wrap(data);
ByteBuffer outBuf;
synchronized (encoder) {
    outBuf = encoder.encode(buf);
}
outBuf.rewind();
ByteBuffer bufLen = ByteBuffer.allocate(Integer.BYTES);
bufLen.putInt(outBuf.remaining());
bufLen.rewind();
attachment.write(bufLen, (att1) ->
    att1.write(outBuf, (att2) -> att2.read(this::readCompleted))
);

Т.е. вначале получаю в буфере содержимое строки, потом в отдельный буфер записываю длину, потом отправляю длину, а при успешной отправке отправляю сами данные.

Вопрос, можно ли как-то записать строку в существующий буфер? Про схему

encoder.reset();
encoder.encode(CharBuffer.wrap(data), buffer, true);
encoder.flush(buffer);

знаю. Но тогда нужно изначально выделить место под buffer. А как его корректно и быстро посчитать - не знаю.

Или оставить как есть, с отправкой двух пакетов?

READ ALSO
Поиск элементов в Listview

Поиск элементов в Listview

На разметке активности есть ListView и EditTextПри вводе символов пользователем в ListView должны оставаться только объекты которые содержат введенные...

221
Как понимать работу jvm?

Как понимать работу jvm?

Я начал интересоваться, как работает виртуальная машина Java

253
ObjectMapper: параметризация

ObjectMapper: параметризация

У меня есть JSON, который нужно прочитать в объект при помощи ObjectMapperВыглядит это так:

522