【问题标题】:XMLEventReader and XMLEventWriter on the same file?XMLEventReader 和 XMLEventWriter 在同一个文件上?
【发布时间】:2020-01-06 19:20:42
【问题描述】:

由于我缺乏文件系统行为的知识,我提前道歉。

我需要读取一个大型 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();
        }

它似乎工作正常。但是,我不知道是否应该创建一个新文件,然后复制旧文件。

我担心以这种方式读取和写入同一路径是否安全。尤其是会插入内容,然后读取操作需要继续,看不到新添加的元素。

【问题讨论】:

    标签: java xml stax


    【解决方案1】:

    这不安全。它似乎在微不足道的情况下工作,但很可能在生产负载下以奇怪而壮观的方式爆炸。正确的解决方案是写入一个新的临时文件,然后在完成后将临时文件重命名为原始文件。 (这也有助于防止部分写入文件)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 2012-01-17
      • 2013-04-20
      • 2016-08-11
      相关资源
      最近更新 更多