Java:String.getBytes(Charset) Vs。用于 OutputStream 的 Charset.encode(String)

dam*_*ewl 3 java string encoding bytebuffer character-encoding

我的算法有两个输入:

  • 1 utf8 将被编码的字符串对象
  • 1 Charset 对象,它指示我需要将字符串编码成什么

最后,返回的结果将被放入一个 OutputStream 中,这个动作可能会发生多次,但至少一次。在这种情况下没有发生多线程。

我找到了两个解决方案:

  1. 在给定的 String 上调用 getBytes(Charset) 并提供给定的 Charset。这将返回一个字节[]
  2. 在给定的字符集上调用 encode(String) 并提供给定的字符串。这将返回一个 ByteBuffer。

深入研究这些方法背后的代码显示了每个底层算法的复杂设计。我不能说我明白如何在这两个选项之间做出选择。

  1. 调用任一方法是否存在显着的性能差异?
  2. 将结果放入 OutputStream 是否有显着的性能差异?
  3. 足迹是否有显着差异?

哪种解决方案通常是更好的选择?

Pet*_*rey 5

在这两种情况下, abyte[]都是动态构建的以对字符串进行编码。更有效的方法是将其直接写入 OutputStream。例如

OutputStreamWriter osw = new OutputStreamWriter(out, StandardCharsets.UTF_8);
// look Mum, no byte[] needed
osw.write(text);
Run Code Online (Sandbox Code Playgroud)

如果您需要二进制格式,另一种方法是使用 DataOutputStream.writeUTF。

  • 除了,如果您使用非 BMP 字符,`DataOutputStream.writeUTF` 会写入破坏的输出(“修改的 UTF”)。 (2认同)