Java 如何有效地将字符串序列化到现有ByteBuffer?

Java 如何有效地将字符串序列化到现有ByteBuffer?,java,string,bytebuffer,Java,String,Bytebuffer,似乎String.getBytes()将创建一个新的字节数组,因此有一个额外的内存副本。我是否可以在不使用中间字节数组的情况下将字符串直接编码到ByteBuffer 例如: void putString(ByteBuffer bb, String s) { byte[] arr = s.getBytes(StandardCharsets.UTF_8); bb.put(arr); } 这段代码将创建一个字节数组,将字符串编码到此字节数组,然后将字节数组的内容复制到ByteBuff

似乎
String.getBytes()
将创建一个新的字节数组,因此有一个额外的内存副本。我是否可以在不使用中间字节数组的情况下将字符串直接编码到
ByteBuffer

例如:

void putString(ByteBuffer bb, String s) {
    byte[] arr = s.getBytes(StandardCharsets.UTF_8);
    bb.put(arr);
}
这段代码将创建一个字节数组,将字符串编码到此字节数组,然后将字节数组的内容复制到ByteBuffer。
我认为字节数组是没有必要的,它会带来GC和额外的内存拷贝

不,这是不可能的。字符串对象没有编码。

字符串对象按用途是不可变的。该类的全部思想是不允许操作任何底层数据结构(主要是出于安全和性能优化的原因)

从这个意义上说:在Java中,没有其他更好的方法可以获取组成字符串对象的字节

您可以使用直接写入
ByteBuffer

static void putString(ByteBuffer buffer, String str, Charset charset) {
    CharsetEncoder encoder = charset.newEncoder();
    encoder.encode(CharBuffer.wrap(str), buffer, true);
    encoder.flush(buffer);
}

确保分配了足够的空间是您的责任。您还可以检查该方法的结果,看看它是否成功。

我想不出一个简单的方法来完全消除中间字节数组

但是,如果您因为字符串太大而担心这个问题,您可以将其分解为块:

  for(offset=0; offset<str.length(); offset+=chunkSize) {
      String chunk = str.substring(offset, offset+chunkSize);
      byteBuffer.put(chunk.getBytes(StandardCharsets.UTF_8));
  }

for(offset=0;offset)这能回答问题吗?答案是:没有这样的问题。我重写了,希望现在更清楚。我不想创建中间字节数组。