如何使用CharSet对CharSequence进行编码(不转换为String)

时间:2013-08-29 15:16:52

标签: 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被接受的地方,它都会在任何工作完成之前迅速转换为字符串。

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

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

2 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:6)

您可以使用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,因此您甚至无需复制首先是字节缓冲区到字节数组。