Java ByteBuffer to String

2022-08-31 07:32:37

这是以这种方式将字节缓冲区转换为字符串的正确方法吗?

String k = "abcd";
ByteBuffer b = ByteBuffer.wrap(k.getBytes());
String v = new String(b.array());

if(k.equals(v))
    System.out.println("it worked");
else
    System.out.println("did not work");

我问的原因是这看起来太简单了,而其他方法,如Java:将字符串与ByteBuffer相互转换以及相关的问题看起来更复杂。


答案 1

有更简单的方法可以将a解码为a,没有任何问题,由Andy Thomas提到。ByteBufferString

String s = StandardCharsets.UTF_8.decode(byteBuffer).toString();

答案 2

编辑(2018年):@xinyongCheng编辑的同级答案是一种更简单的方法,应该是可接受的答案

如果您知道字节位于平台的默认字符集中,则您的方法将是合理的。在您的示例中,这是真的,因为返回平台的默认字符集中的字节。k.getBytes()

更常见的情况是,您需要指定编码。但是,有一种比您链接的问题更简单的方法可以做到这一点。字符串 API 提供在特定编码的字符串和 byte[] 数组之间进行转换的方法。这些方法建议使用CharsetEncoder/CharsetDecoder,“当需要对解码[编码]过程进行更多控制时”。

要从特定编码的字符串中获取字节,可以使用同级 getBytes() 方法:

byte[] bytes = k.getBytes( StandardCharsets.UTF_8 );

要将具有特定编码的字节放入字符串中,可以使用其他字符串构造函数:

String v = new String( bytes, StandardCharsets.UTF_8 );

请注意,这是一个可选操作。如果您已经使用数组构造了 ByteBuffer,则可以直接使用该数组。否则,如果要安全,请使用 将字节从缓冲区获取到字节数组中。ByteBuffer.array()ByteBuffer.get(byte[] dst, int offset, int length)