XMLEventReader и XMLEventWriter в одном файле? - PullRequest
0 голосов
/ 06 января 2020

Заранее извиняюсь, поскольку мне не хватает знаний о поведении файловой системы.

Мне нужно прочитать большой файл XML, изменить его, а затем записать в тот же файл.

Вот мой код для настройки XMLEventReader и XMLEventWriter:

        XMLInputFactory xmlif = XMLInputFactory.newInstance();
        InputStreamReader isr = new InputStreamReader(new FileInputStream(m_cPath.toString()),
                StandardCharsets.UTF_8.name());
        m_evtr = xmlif.createXMLEventReader(isr); 

        XMLOutputFactory xmlof = XMLOutputFactory.newInstance();
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(m_cPath.toString()), StandardCharsets.UTF_8);
        m_evtw = xmlof.createXMLEventWriter(osw);
        m_evtf = XMLEventFactory.newInstance();     

Если бы у меня был такой ввод, как:

   <root>
      <entry>1</entry>
      <insert />
      <entry>2</entry>
      <entry>3</entry>
      <entry>4</entry>
   </root>

Если бы я сделал что-то вроде следующего, было бы это будет безопасно?

        try {
            while(m_evtr.hasNext()) {
                XMLEvent evt = m_evtr.nextEvent();
                m_evtw.add(evt);

                if( evt.isEndElement()) {
                    EndElement endElement = evt.asEndElement();
                    String localName = endElement.getName().getLocalPart();
                    if( localName.equals("insert") ) {
                        // create and write new entry elements following the insert element here
                    }
                }
            }
        } finally {
            isr.close();
            osw.close();
            m_evtr.close();
            m_evtw.close();
        }

Вроде нормально работает. Но я не знаю, должен ли я создавать новый файл, а затем копировать старый.

Меня беспокоит вопрос, можно ли безопасно читать и писать по одному и тому же пути таким образом. Тем более, что будет вставлено содержимое, а затем операции чтения необходимо продолжить, не видя вновь добавленные элементы.

1 Ответ

2 голосов
/ 06 января 2020

Это не безопасно. Похоже, что это работает в тривиальных случаях, но, скорее всего, взорвется странным и впечатляющим образом при производственных нагрузках. Правильное решение - записать в новый временный файл, а затем, после завершения, переименовать временный файл в исходный файл. (это также помогает предотвратить частично записанные файлы).

...