Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用StAX编写大型XML文件_Java_Xml_Stax - Fatal编程技术网

Java 使用StAX编写大型XML文件

Java 使用StAX编写大型XML文件,java,xml,stax,Java,Xml,Stax,我有一些数据(大约150-200 MB)需要转换成XML文件。我以前尝试过基于DOM来实现它,但是内存是一个很大的限制 我开始研究StaX实现,并提出了一些疑问 假设我有以下代码 XMLStreamWriter writer = factory.createXMLStreamWriter(new FileWriter("output.xml")); writer.writeStartDocument(" "); writer.writeStartElement(" "); wr

我有一些数据(大约150-200 MB)需要转换成XML文件。我以前尝试过基于DOM来实现它,但是内存是一个很大的限制

我开始研究StaX实现,并提出了一些疑问

假设我有以下代码

  XMLStreamWriter writer = factory.createXMLStreamWriter(new FileWriter("output.xml"));
  writer.writeStartDocument("  ");
  writer.writeStartElement(" ");
  writer.writeStartElement("");
  // call method X a million times
  writer.writeEndElement(" ");
  writer.flush();
  writer.close();

  // method x
  X() {
     writer.writeStartElement("  ");
     writer.writeEndElement();
  }
  • 我假设每当执行方法X时,它都会将元素写入文件中。直到现在,转换后的XML才保存在内存中。我说得对吗

  • 这会像前两个开始元素一样自动关闭未关闭的标记吗

  • 我是否可以刷新写入程序并再次使用同一个写入程序在文件中添加更多xml,如下所示:

    X() 
    {
        writer.writeStartElement("  ");
        writer.writeEndElement();
        writer.flush();
    }
    
  • 是的,但是您应该在缓冲区中缓冲一些(小的)写操作。除了FileWriter之外,还应该使用BufferedWriter。否则,它会进行太多的系统调用,例如

  • 一旦调用writeEndElement(),它就会写入结束标记

  • 是的,应该是这样

  • 我假设每当执行方法X时,它都会写入 元素添加到文件中。直到现在,它还不能保存转换后的XML 记忆。我说得对吗

    StAX解析器可以在将XML子集写入文件之前将其缓冲在内存中,以减少为提高性能而进行的磁盘I/O量。它不会缓存太多以至于内存不足

    这会像前两次启动一样自动关闭未关闭的标签吗 元素

    writeEndDocument
    方法将自动关闭所有未关闭的标记

    我可以刷新写入程序并再次使用同一个写入程序来附加一些吗 将更多xml插入文件,如下所示:

    X() 
    {
        writer.writeStartElement("  ");
        writer.writeEndElement();
        writer.flush();
    }
    

    您可以继续使用相同的
    XMLStreamWriter
    将内容写入XML文件,直到调用
    writeEndDocument
    。在编写更多内容之前,无需显式调用
    flush
    。使用完
    XMLStreamWriter
    后,应该调用
    close
    来释放它。

    您的XML结构是否非常复杂(有很多不同类型的节点和深层次的层次结构)?是的。数据是动态的,我们需要基于dataOk创建XML。我以为这只是一个数据解析。所以,也许你会考虑用轻量级的StringBuffer来做这件事。我对1或2没有答案,但我觉得你会有问题。您考虑过JAXB吗?JAXB听起来正是OP试图避免的,因为它要求您在内存中保存所有数据。请使用
    factory.createXMLStreamWriter(新文件输出流(“output.xml”),“UTF-8”)
    。FileWriter使用默认(OS)编码。最好在文件output.xml.gz上使用压缩的GzipOutputStream。谢谢。这很有帮助。:)