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

标签 java encoding inputstream

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

在某些情况下,我们需要运行它两次。对于我的一生,我无法告诉你为什么,我一直在努力找出造成这种情况的原因,但我一无所获。只是似乎有一些文件在第一次运行时并不正确,但是当第二次运行时一切终于都好了。

这是执行编码的代码(假设“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 之外,还有哪些修复流编码的替代方法可能效果更好?

最佳答案

使用 XML 有一些小问题:在第一行 <?xml ... ?>指定编码或默认为 UTF-8。因此,XML 通常被读取为 InputStream(二进制),并留给 XML 解析器来找出编码。

编写 XML 时,人们可能会假设它是在字符串中表示的。当从 <?xml ... ?> 写入编码时应该用在 new OutputStreamWriter(ouputStream, encoding) 中.

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

如果您想立即以正确的编码读取文本:我搜索了 XMLInputStreamReader 并找到了一些。但是您的 Reader 类需要做的就是:缓冲 ByteArrayOutputStream 中的第一个字节,直到 <?xml encoding=...?>处理完毕,然后做一个InputStreamReader。

关于Java:InputStreamReader字符编码需要运行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38224818/

相关文章:

java - 处理外部文件的 getResourceAsStream

c++ - get函数的stringstream不删除字符

java - 在 javafx 从另一个包加载 FXML 文件时出现错误?

java - 一种调度算法

java - 获取不受支持或无法识别的 SSL 消息;调用外部 API 时嵌套异常是 javax.net.ssl.SSLException

encoding - 使用淡入淡出创建示例 mp3

perl - 将 utf8 解码为 ISO-8859-1 邮件主题到 .procmailrc 文件中的文本

python - 让 JSON 对象接受字节或让 urlopen 输出字符串

JavaFX TableView 父列标签不可见

java - 在 Swing 中输入格式化的日期和时间以使用 GET REST 获取节点