9

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

问题是,有很多 CharSequence 需要编写,有些非常大。更复杂的是,所有内容都可能写入多个 OutputStream。我可以很容易地通过使用来实现它(实际上我目前已经用这种方式实现了):

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

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

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

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

4

2 回答 2

8

您可以使用Charset将 a 编码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直接采用,因此您甚至不需要先将字节缓冲区复制到字节数组。

于 2013-08-29T15:29:32.463 回答
6

遍历序列的字符并将它们写入作家。

OutputStream outputStream = ....
CharSequence charSequence = ....
Charset charset = ....

Writer writer = new OutputStreamWriter(outputStream, charset);

for (int i = 0; i < charSequence.length(); i++) {
    writer.write(charSequence.charAt(i));
}
于 2013-08-29T15:22:45.620 回答