java - 如何使用 CharSet 对 CharSequence 进行编码(不转换为字符串)

标签 java character-encoding charsequence

我想使用指定的 CharSet 将 CharSequence 写入 OutputStream。基本上,当 write(String) 被调用时,使用相同 CharSet 初始化的 Writer 会做什么。

要注意的是,要编写的 CharSequences 很多,而且有些非常大。更复杂的是,所有内容都可能写入多个 OutputStream。我可以通过使用轻松实现它(实际上我目前已经以这种方式实现了它):

byte[] rawBytes = CharSequence.toString().getBytes(CharSet)
for (OutputStream out : outputTargets) {
    out.write(rawBytes);
}

但显然 String 在这里是一个完全不需要的垃圾对象,byte[] 数组也是如此。我正在寻找一种无需中间对象即可直接进行编码的方法。令人惊讶的是,这似乎是不可能的 - 我在 JRE 中看到的每一个接受 CharSequence 的地方,它都会在完成任何工作之前快速转换为 String。

CharSet 的大部分(全部?)转换工作似乎是在非公共(public)类中完成的,所以我还没有找到任何方法以透明和合法的方式访问其中的任何一个。

如何避免垃圾/直接使用JRE的CharSet编码工具?

最佳答案

您可以使用 CharsetCharSequence 编码为字节数组:

private static byte[] encodeUtf8(CharSequence cs) {
    ByteBuffer bb = Charset.forName("UTF-8").encode(CharBuffer.wrap(cs));
    byte[] result = new byte[bb.remaining()];
    bb.get(result);
    return result;
}

如果您使用的不是 OutputStream,而是 WritableByteChannel 的实例,则其 write 方法采用 ByteBuffer 直接,所以您甚至不需要先将字节缓冲区复制到字节数组。

关于java - 如何使用 CharSet 对 CharSequence 进行编码(不转换为字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18514836/

相关文章:

C++ char序列函数总是返回空字符串

java - 带有 StringBuilder 和 CharSequence 的 ClassCastException

java - CharSequence 到 int

java - ssl 套接字与 epp 服务器通信

r - 如何将特殊字符转换为 R 中的 unicode?

python - 使用 scrapy 进行网页抓取时的字符编码问题

Ruby/Rails : how to handle incoming URLs with ruby 1. 8 UTF-8 编码(如\xc3\xa1)

java - 空 ListView 显示另一个 Activity

java - 计算威胁

java - Spring Cassandra Repository - 在后台线程中保存记录