1. 概述

ByteBufferjava.nio 包中众多有益类之一,它用于从通道读取数据并直接将数据写入通道。

在这个简短的教程中,我们将学习如何在 Java 中将 ByteBuffer 转换为 String

2. 将 ByteBuffer 转换为 String

ByteBuffer 转换为 String 的过程是解码,这需要一个字符集。

有三种方式可以将 ByteBuffer 转换为 String

  • 通过 bytebuffer.array() 创建新的 String
  • 通过 bytebuffer.get(bytes) 创建新的 String
  • 使用 charset.decode() 方法

我们将使用一个简单的示例来展示这三种将 ByteBuffer 转换为 String 的方法。

3. 实际示例

3.1. 通过 bytebuffer.array() 创建新 String

首先,我们需要从 ByteBuffer 获取字节数组。为此,我们可以调用 ByteBuffer.array() 方法,这将返回底层数组。

然后,我们可以调用 String 构造函数,它接受一个字节数组和字符编码来创建新的 String

@Test
public void convertUsingNewStringFromBufferArray_thenOK() {
    String content = "baeldung";
    ByteBuffer byteBuffer = ByteBuffer.wrap(content.getBytes());

    if (byteBuffer.hasArray()) {
        String newContent = new String(byteBuffer.array(), charset);

        assertEquals(content, newContent);
    }
}

3.2. 通过 bytebuffer.get(bytes) 创建新 String

在 Java 中,我们可以使用 new String(bytes, charset) 将一个 byte[] 转换为 String

对于字符数据,我们可以使用 UTF_8 字符集将 byte[] 转换为 String。然而,当 byte[] 存储非文本二进制数据时,最佳做法是将 byte[] 转换为 Base64 编码的 String

@Test
public void convertUsingNewStringFromByteBufferGetBytes_thenOK() {
    String content = "baeldung";
    ByteBuffer byteBuffer = ByteBuffer.wrap(content.getBytes());

    byte[] bytes = new byte[byteBuffer.remaining()];
    byteBuffer.get(bytes);
    String newContent = new String(bytes, charset);

    assertEquals(content, newContent);
}

3.3. 使用 charset.decode()

这是最简单的方式,没有问题地将 ByteBuffer 转换为 String

@Test
public void convertUsingCharsetDecode_thenOK() {
    String content = "baeldung";
    ByteBuffer byteBuffer = ByteBuffer.wrap(content.getBytes());

    String newContent = charset.decode(byteBuffer).toString();

    assertEquals(content, newContent);
}

4. 将 String 转换为 ByteBuffer

要将 String 转换为 ByteBuffer,我们首先需要将字符串编码为一序列字节,然后从这些字节创建 ByteBuffer。这个过程是必要的,因为 String 中的字符需要用特定的字符编码表示为字节:

@Test
public void convertStringToByteBuffer_thenOk() {
    String inputString = "Hello, ByteBuffer!";
    byte[] expectedBytes = inputString.getBytes(Charset.forName("UTF-8"));
    ByteBuffer byteBuffer = ByteBuffer.wrap(expectedBytes);

    assertEquals(expectedBytes, byteBuffer.array());
}

在上述示例中,我们首先使用 getBytes(Charset.forName("UTF-8")) 方法,使用 UTF-8 字符编码将字符串转换为字节数组。然后,我们使用 ByteBuffer.wrap(byteArray) 方法从字节数组创建 ByteBuffer

请注意,如果需要将字节重新转换回 String,确保使用相同的编码。

5. 总结

在这篇教程中,我们学习了在 Java 中将 ByteBuffer 转换为 String 的三种方法。请记住使用正确的 字符编码,在示例中我们使用了 UTF-8

如往常一样,示例的完整源代码可在 GitHub 上找到。