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

Dur*_*dal 6 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Kei*_*ith 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));
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*ung 6

您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)

如果OutputStream您使用的是实例,而不是直接使用WritableByteChannel它的write方法ByteBuffer,那么您甚至不需要先将字节缓冲区复制到字节数组中.

  • 我相信OP希望避免为整个序列创建一个内存中的字节数组.想象一下,CharSequence比可用RAM大10倍.在这种情况下,这种方法不起作用,对吗? (2认同)