有没有办法从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
的内容来压缩字符串。
答案 0 :(得分:1)
没有这样的事情。
ByteBuffer不包含字符。必须先将它们转换为字符,然后才能从中创建一个字符串。
此外,String必须位于JVM内存中。 ByteBuffer可以映射或直接,在这两种情况下它都在JVM之外。
为了将数据移动到JVM并将其转换为字符,您必须使用辅助数组。
答案 1 :(得分:1)
java.lang.String是不可变的和最终的,所以最终没有选择,但最终以它已接受的格式提供数据。 (当然没有用反射来操纵它的内部......)
你可以隐藏使用字符串构建器或其他东西的API背后的丑陋,但在某些时候会在内存中有两个数组副本,一个在构建器中,一个用于实际字符串。
答案 2 :(得分:0)
String
由char
s而非byte
组成。您需要一个字符集,用于将字节转换为字符,例如UTF-8,UTF-16,ISO-8859-1,ISO-8859-5,......
如果您不知道字符集,则不会知道字节代表哪个字符。