java之将字节数组从编码A转换为编码B
youxin
阅读:28
2024-09-07 23:24:14
评论:0
我有一个很有趣的话题-至少对我来说。给定ByteArrayOutputStream,例如在UTF-8中具有字节,我需要一个函数,可以将这些字节“转换”为另一个-new-ByteArrayOutputStream,例如UTF-16或ASCII,或者您将其命名。我的幼稚方法是使用InputStreamReader并提供所需的编码,但这没有用,因为它将读入char []并且我只能将byte []写入新的BAOS。
public byte[] convertStream(Charset encoding) {
ByteArrayInputStream original = new ByteArrayInputStream(raw.toByteArray());
InputStreamReader contentReader = new InputStreamReader(original, encoding);
ByteArrayOutputStream converted = new ByteArrayOutputStream();
int readCount;
char[] buffer = new char[4096];
while ((readCount = contentReader.read(buffer, 0, buffer.length)) != -1)
converted.write(buffer, 0, readCount);
return converted.toByteArray();
}
现在,这显然是行不通的,我正在寻找一种方法来使这种情况成为可能,而无需在byte []之外构建String。
@编辑:
由于似乎很难读懂明显的东西。
1)raw:ByteArrayOutputStream包含从客户端发送给我们的BINARY对象的字节。字节通常作为HTTP消息的一部分出现在UTF-8中。
2)这里的目标是将该BINARY数据发送到不灵活的内部系统-嗯,这是一个内部系统-并且它接受UTF-16中的此类附件。我不知道为什么甚至不问,它是这样做的。
因此,为我的问题辩护:有没有办法将字节数组从Charset A转换为Charset B或选择编码。再一次,构建字符串不是我想要的。
谢谢,并希望清除有问题的部分:)。
请您参考如下方法:
如评论中所述,我只是将其转换为字符串:
String text = new String(raw.toByteArray(), encoding);
byte[] utf8 = text.getBytes(StandardCharsets.UTF_8);
但是,如果这不可行(由于某些未指明的原因...),那么您现在所拥有的几乎已经存在了-您只需要在组合中添加一个
OutputStreamWriter
即可:
// Nothing here should throw IOException in reality - work out what you want to do.
public byte[] convertStream(Charset encoding) throws IOException {
ByteArrayInputStream original = new ByteArrayInputStream(raw.toByteArray());
InputStreamReader contentReader = new InputStreamReader(original, encoding);
int readCount;
char[] buffer = new char[4096];
try (ByteArrayOutputStream converted = new ByteArrayOutputStream()) {
try (Writer writer = new OutputStreamWriter(converted, StandardCharsets.UTF_8)) {
while ((readCount = contentReader.read(buffer, 0, buffer.length)) != -1) {
writer.write(buffer, 0, readCount);
}
}
return converted.toByteArray();
}
}
请注意,您仍在创建内存中数据的额外临时副本,公认的是在UTF-8中而不是在UTF-16中...但是从根本上讲,这几乎比创建字符串更有效。
如果内存效率是一个特别重要的问题,则可以执行多次以找出需要多少字节,创建一个写长度的字节数组,然后调整代码以直接写入该字节数组。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。