Java:InputStreamReader字符编码需要运行两次

问题描述 投票:0回答:1

我的公司与世界各地的客户进行了大量的 XML 转换工作。因此,我们有时会遇到字符编码问题。我们的应用程序有一个组件,旨在将 InputStream 规范化为特定的字符编码。它运作良好......但有一个问题。

有些情况下,我们需要运行两次。对于我的一生,我无法告诉你原因,我一直在努力找出造成它的原因,但我什么也没想到。只是好像有些文件第一次运行的时候不对,但是第二次运行的时候终于好了。

这里是编码的代码(假设“encoding”变量是“UTF-8”,它通常是):

char[] buffer = new char[getBufferSize()];
String encoding = getEncoding();

Cache fileCache = getFileCache();

try (InputStreamReader reader = new InputStreamReader(data.getDataStream(), encoding); Writer writer = fileCache.getWriter(encoding)) {
    int charsRead;
    while ((charsRead = reader.read(buffer)) != -1) {
        writer.write(buffer, 0, charsRead);
    }
    data.setDataStream(fileCache.getInputStream());
} catch(IOException ex) {
    throw new Exception(String.format("Unable to normalize stream for %s encoding", encoding), ex);
}

所以,有时这段代码需要运行两次才能使流以指定的编码正确运行。

我想让它在第一次尝试时运行得更好。

  1. 这个问题可能有什么原因?

  2. 是否有任何方法可以改进此代码以使“流规范化”(我们称之为)更有效?

  3. 除了使用 InputStreamReader 之外,还有哪些修复流编码的替代方法可能效果更好?

java encoding inputstream
1个回答
2
投票

对于 XML,存在一些小问题:在第一行中,

<?xml ... ?>
指定编码或默认为 UTF-8。因此,XML 通常被读取为 InputStream(二进制)并留给 XML 解析器来找出编码。

在编写 XML 时,人们可能会假设用字符串表示。当从

<?xml ... ?>
编写编码时,应该在
new OutputStreamWriter(ouputStream, encoding)
.

中使用

二进制输入和输出 XML 必须在处理编码的程序员编辑器(如 JEdit 或 Notepad++)中测试其编码。

如果您想以正确的编码立即阅读文本:我搜索了 XMLInputStreamReader 并找到了一些。但是您所有的 Reader 类都需要做:缓冲 ByteArrayOutputStream 中的第一个字节,直到处理

<?xml encoding=...?>
,然后执行 InputStreamReader。

© www.soinside.com 2019 - 2024. All rights reserved.