2

有什么方法可以将大型 XML 文件(500+MB)从“Windows-1252”编码转换为“UTF-8”编码在 java 中?

4

3 回答 3

3

当然:

  • 使用 Windows-1252 为输入打开一个FileInputStream包装在一个InputStreamReader
  • 使用 UTF-8 编码打开一个FileOutputStream包装在一个中的输出OutputStreamWriter
  • 创建一个缓冲区字符数组(例如 16K)
  • 反复读入数组并写入已写入的内容:

    char[] buffer = new char[16 * 1024];
    int charsRead;
    while ((charsRead = input.read(buffer)) > 0) {
        output.write(buffer, 0, charsRead);
    }
    
  • 之后不要忘记关闭输出!(否则可能会有永远不会写入磁盘的缓冲数据。)

请注意,由于它是 XML,您可能还需要手动更改 XML 声明,因为它应该指定它在 Windows-1252 中...

这在流式基础上工作的事实意味着您无需担心文件的大小 - 它一次最多只能在内存中读取 16K 个字符。

于 2013-10-03T16:51:00.873 回答
2

这是一次性的工作还是需要反复运行并提高效率的工作?

如果是一次性的,我认为不需要 Java 编码。只需运行查询“.”,例如

java net.sf.saxon.Query -s:input.xml -qs:. -o:output.xml

确保分配 3Gb 的内存。

如果您重复执行此操作并希望采用流式处理方法,则必须在将其处理为文本(如 Jon Skeet 建议的那样)或 XML 之间进行选择。将其作为 XML 执行的优点主要是 XML 声明将得到处理,并且字符引用将被转换为字符。最简单的是使用 JAXP 身份转换:

Source in = new StreamSource(new File("input.xml"));
TransformerFactory f = TransformerFactory.newInstance();
Result out = new StreamResult(new File("output.xml"));
f.newTransformer().transform(in, out);
于 2013-10-03T19:09:24.033 回答
0

如果这是一次性的,Java 可能不是最合适的工具。考虑iconv

iconv -f windows-1252 -t utf-8 <source.xml >target.xml

这具有流式传输的所有好处,而无需您编写任何代码。

与 Michael 的解决方案不同,这不会处理 XML 声明。如有必要,请手动编辑,或者现在您使用的是 UTF-8,请忽略它。

于 2013-10-05T09:17:03.460 回答