2013-10-03 7 views

ответ

3

уверен:

  • Открыть 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 тыс. Символов в памяти за раз.

2

Это одноразовая работа или задание, которое необходимо выполнить многократно и сделать эффективным?

Если это одноразовый, я не вижу необходимости в кодировании 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); 
0

Если это одноразовый, Java может оказаться не самым подходящим инструментом. Рассмотрим iconv:

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

Это имеет все преимущества потокового без необходимости писать код.

В отличие от решения Майкла, это не позаботится о декларации XML. Измените это вручную, если необходимо, или, если вы используете UTF-8, опустите его.

 Смежные вопросы

  • Нет связанных вопросов^_^