是否有任何方法可以转换来自Windows-1252'的大型XML文件(500 + MB)。编码为' UTF-8'在java编码?
答案 0 :(得分:3)
不确定
FileInputStream
中的InputStreamReader
作为输入FileOutputStream
中的OutputStreamWriter
反复读入数组然后写了很多内容:
char[] buffer = new char[16 * 1024];
int charsRead;
while ((charsRead = input.read(buffer)) > 0) {
output.write(buffer, 0, charsRead);
}
请注意,由于它是XML,您可能还需要手动更改XML声明,因为它应指定它在Windows-1252中...
这种方式在流媒体基础上工作意味着您无需担心文件的大小 - 它一次只能读取内存中最多16K个字符。
答案 1 :(得分:2)
这是一次性还是需要重复运行并提高效率的工作?
如果是一次性的话,我认为不需要Java编码。只需运行查询“。”,例如
java net.sf.saxon.Query -s:input.xml -qs:. -o:output.xml
确保你分配说3Gb的内存。
如果您反复进行并希望采用流式处理方法,则必须选择将其作为文本处理(如Jon Skeet建议)或XML。以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);
答案 2 :(得分:0)
如果这是一次性的,Java可能不是最合适的工具。考虑iconv
:
iconv -f windows-1252 -t utf-8 <source.xml >target.xml
这具有流媒体的所有好处,无需您编写任何代码。
与迈克尔的解决方案不同,这不会处理XML声明。如有必要,请手动编辑,或者现在使用UTF-8,省略它。