有什么方法可以将大型 XML 文件(500+MB)从“Windows-1252”编码转换为“UTF-8”编码在 java 中?
问问题
2641 次
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 回答