Java:String.getBytes(Charset)与Charset.encode(String)用于OutputStream

Java:String.getBytes(Charset)与Charset.encode(String)用于OutputStream,java,string,encoding,character-encoding,bytebuffer,Java,String,Encoding,Character Encoding,Bytebuffer,我的算法有两个输入: 1个将被编码的utf8字符串对象 1个字符集对象,指示需要将字符串编码到的内容 最后,返回的结果将被放入OutputStream,这是一个可能发生多次但至少发生一次的操作。在这个场景中没有多线程发生 我找到了两种解决办法: 对给定字符串调用getBytes(字符集)并提供给定的字符集。这将返回一个字节[] 在给定的字符集上调用encode(String)并提供给定的字符串。这将返回一个ByteBuffer 深入研究这些方法背后的代码显示了每个底层算法的复杂设计。我不能说

我的算法有两个输入:

  • 1个将被编码的utf8字符串对象
  • 1个字符集对象,指示需要将字符串编码到的内容
最后,返回的结果将被放入OutputStream,这是一个可能发生多次但至少发生一次的操作。在这个场景中没有多线程发生

我找到了两种解决办法:

  • 对给定字符串调用getBytes(字符集)并提供给定的字符集。这将返回一个字节[]
  • 在给定的字符集上调用encode(String)并提供给定的字符串。这将返回一个ByteBuffer
  • 深入研究这些方法背后的代码显示了每个底层算法的复杂设计。我不能说我理解如何在这两个选项之间做出选择

  • 调用这两种方法是否存在显著的性能差异
  • 将结果放入OutputStream是否存在显著的性能差异
  • 足迹是否存在显著差异

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

    在这两种情况下,动态构建
    字节[]
    来编码字符串。一种更有效的方法是将其直接写入OutputStream。e、 g

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

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

    很可能不使用,最可能不使用,最可能不使用,并使用您觉得合适的格式。像这样的微优化是浪费时间。@Kayaman我喜欢“微优化”这个词,因为很多人都喜欢它的想法。@Kayaman我可以理解你是否正在开发一个需要在微秒级进行优化的应用程序。但对于那些使用java编写此类程序的人,我只能说“祝你好运”:@nafas这一切都取决于他们的技能。例如,下面的Lawrey先生使用Java创建了几个性能关键型库。除了,
    DataOutputStream.writeUTF
    写入中断的输出(“修改的UTF”)如果您使用非BMP字符。@ChrisJester Young DataOutputStream.writeUTF只有在使用DataInputStream.readUTF esp时才真正有用,因为它在开头添加了两个字节作为长度。例如,它不会损坏字符。