Java 将Windows-1252 xml文件转换为UTF-8
是否有任何方法可以将大型XML文件(500+MBs)从java中的“Windows-1252”编码转换为“UTF-8”编码 当然可以:Java 将Windows-1252 xml文件转换为UTF-8,java,xml,utf-8,xml-parsing,xmlencoder,Java,Xml,Utf 8,Xml Parsing,Xmlencoder,是否有任何方法可以将大型XML文件(500+MBs)从java中的“Windows-1252”编码转换为“UTF-8”编码 当然可以: 使用Windows-1252打开包装在InputStreamReader中的FileInputStream,以进行输入 打开一个用UTF-8编码的OutputStreamWriter包装的FileOutputStream 创建缓冲区字符数组(例如16K) 重复读取数组并写入已写入的内容: char[] buffer = new char[16 * 1024];
- 使用Windows-1252打开包装在
中的InputStreamReader
,以进行输入FileInputStream
- 打开一个用UTF-8编码的
包装的OutputStreamWriter
FileOutputStream
- 创建缓冲区字符数组(例如16K)
- 重复读取数组并写入已写入的内容:
char[] buffer = new char[16 * 1024]; int charsRead; while ((charsRead = input.read(buffer)) > 0) { output.write(buffer, 0, charsRead); }
- 之后不要忘记关闭输出!(否则,可能存在从未写入磁盘的缓冲数据。)
事实上,这是在流式传输的基础上工作的,这意味着您不需要担心文件的大小——它一次最多只能读取内存中的16K个字符。这是一次性的还是需要重复运行以提高效率的作业 如果是一次性的,我认为没有必要使用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);
如果这是一次性的,Java可能不是最合适的工具。考虑:
iconv-f windows-1252-t utf-8 target.xml
这具有流式传输的所有好处,无需编写任何代码
与Michael的解决方案不同,这不会处理XML声明。如有必要,请手动编辑此项,或者,现在您正在使用UTF-8,请忽略它
iconv -f windows-1252 -t utf-8 <source.xml >target.xml