Есть ли какой-нибудь подход для преобразования большого XML-файла (500 + МБ) из кодировки Windows-1252 в кодировку «UTF-8» в java?Преобразование файла Windows-1252 xml в UTF-8
ответ
уверен:
- Открыть
FileInputStream
завернутые вInputStreamReader
с Windows-1252 для ввода - Откройте
FileOutputStream
завернутые вOutputStreamWriter
с кодировкой UTF-8 для вывода - Создать массив буфера char (например, 16K)
Неоднократно считывается в массив и записывается сколько было написано:
char[] buffer = new char[16 * 1024]; int charsRead; while ((charsRead = input.read(buffer)) > 0) { output.write(buffer, 0, charsRead); }
- Не забудьте закрыть выход после этого! (В противном случае может быть помещены в буфер данные, которые никогда не получает записи на диск.)
Обратите внимание, что, как это XML, вы можете также необходимо вручную изменить декларацию XML, а также, как это должно быть указанием, что это в Windows-1252 ...
Тот факт, что это работает на потоковой основе, означает, что вам не нужно беспокоиться о размере файла - он считывает только до 16 тыс. Символов в памяти за раз.
Это одноразовая работа или задание, которое необходимо выполнить многократно и сделать эффективным?
Если это одноразовый, я не вижу необходимости в кодировании Java. Просто запустите запрос «.», Например
java net.sf.saxon.Query -s:input.xml -qs:. -o:output.xml
Убедившись, что вы выделили упомянутый 3Gb памяти.
Если вы делаете это неоднократно и хотите потокового подхода, вам нужно выбирать между обработкой его как текста (как предлагает Джон Скит) или как 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
:
iconv -f windows-1252 -t utf-8 <source.xml >target.xml
Это имеет все преимущества потокового без необходимости писать код.
В отличие от решения Майкла, это не позаботится о декларации XML. Измените это вручную, если необходимо, или, если вы используете UTF-8, опустите его.