从ByteBuffer读取字符串而不进行双缓冲

时间:2013-02-25 23:49:36

标签: java optimization nio bytebuffer

有没有办法从String构建ByteBuffer,而无需先将内容从缓冲区读取到中间byte[]char[]

类似string constructor that takes a byte[]的API让我觉得理想:

public String(ByteBuffer buffer, int offset, int length, Charset charset)

......但不存在这样的事情。

我找到How to convert from ByteBuffer to Integer and String?,但它使用辅助数组。

到目前为止,我发现的最好的事情是将字节缓冲区投影为CharBuffer并调用toString()。但是,这并不允许使用类似UTF-8的内容来压缩字符串。

3 个答案:

答案 0 :(得分:1)

没有这样的事情。

ByteBuffer不包含字符。必须先将它们转换为字符,然后才能从中创建一个字符串。

此外,String必须位于JVM内存中。 ByteBuffer可以映射或直接,在这两种情况下它都在JVM之外。

为了将数据移动到JVM并将其转换为字符,您必须使用辅助数组。

答案 1 :(得分:1)

java.lang.String是不可变的和最终的,所以最终没有选择,但最终以它已接受的格式提供数据。 (当然没有用反射来操纵它的内部......)

你可以隐藏使用字符串构建器或其他东西的API背后的丑陋,但在某些时候会在内存中有两个数组副本,一个在构建器中,一个用于实际字符串。

答案 2 :(得分:0)

Stringchar s而非byte组成。您需要一个字符集,用于将字节转换为字符,例如UTF-8,UTF-16,ISO-8859-1,ISO-8859-5,......

如果您不知道字符集,则不会知道字节代表哪个字符