我想使用指定的 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编码工具?
最佳答案
您可以使用 Charset
将 CharSequence
编码为字节数组:
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/