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)这能回答问题吗?答案是:没有这样的问题。我重写了,希望现在更清楚。我不想创建中间字节数组。