我想使用指定的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编码设施直接使用?
答案 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)
您可以使用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
,因此您甚至无需复制首先是字节缓冲区到字节数组。