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编码设施直接使用?
迭代序列的字符并将它们写入编写器.
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)
您可以使用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,那么您甚至不需要先将字节缓冲区复制到字节数组中.
| 归档时间: |
|
| 查看次数: |
3653 次 |
| 最近记录: |