Avoid additional copy on Java text parsing
Directly pass the buffer range to the String constructor.
@@ -21,7 +21,6 @@ public class ControlMessageReader {
private final byte[] rawBuffer = new byte[MESSAGE_MAX_SIZE];
private final ByteBuffer buffer = ByteBuffer.wrap(rawBuffer);
- private final byte[] textBuffer = new byte[CLIPBOARD_TEXT_MAX_LENGTH];
public ControlMessageReader() {
// invariant: the buffer is always in "get" mode
@@ -111,8 +110,10 @@ public class ControlMessageReader {
if (buffer.remaining() < len) {
return null;
}
- buffer.get(textBuffer, 0, len);
- return new String(textBuffer, 0, len, StandardCharsets.UTF_8);
+ int position = buffer.position();
+ // Move the buffer position to consume the text
+ buffer.position(position + len);
+ return new String(rawBuffer, position, len, StandardCharsets.UTF_8);
}
private ControlMessage parseInjectText() {
