我有一个非常有趣的话题--至少对我来说是这样。例如在UTF-8中给定一个带有字节的新的,我需要一个函数来将这些字节“转换”成UTF-16中的另一个- ByteArrayOutputStream - ByteArrayOutputStream,或者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[]中构建字符串。
@Edit:因为看起来很难读懂那些显而易见的东西。1) raw:包含从客户端发送给我们的二进制对象字节的ByteArrayOutputStream。这些字节通常以UTF-8格式作为HTTP消息的一部分。2)这里的目标是将这些二进制数据转发到一个不灵活的内部系统--这是一个内部系统--它接受UTF-16格式的这种附件。我不知道为什么连问都不问,它是这么做的。
因此,为了证明我的问题:有没有一种方法可以将字节数组从字符集A转换为字符集B或对您的选择进行编码。再说一次,构建字符串不是我想要的。
谢谢你,并希望这能澄清有问题的部分:)。
发布于 2015-12-22 18:41:41
正如评论中提到的,我只是将其转换为一个字符串:
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...但从根本上说,这并不比创建字符串更有效。
如果内存效率是一个特殊的问题,您可以执行多次遍历,以计算需要多少字节,创建一个写入长度的字节数组,然后调整代码以直接写入该字节数组。
https://stackoverflow.com/questions/34413681
复制相似问题