使用Java基于大小拆分XML

使用Java基于大小拆分XML,java,xml,filesplitting,Java,Xml,Filesplitting,我尝试使用以下方法拆分XML文件,它创建了第一个拆分文件没有问题,但当我使用output.clear()时;要清除已写入的XMLEvents数组,它将抛出一个错误 错误:线程“main”javax.xml.stream.XMLStreamException中出现异常:未找到要写入的元素:java.lang.ArrayIndexOutOfBoundsException:-1 我试图调查这个问题,但没有成功,任何关于导致错误的原因或如何克服错误的建议都非常感谢 public void SplitBy

我尝试使用以下方法拆分XML文件,它创建了第一个拆分文件没有问题,但当我使用output.clear()时;要清除已写入的XMLEvents数组,它将抛出一个错误

错误:线程“main”javax.xml.stream.XMLStreamException中出现异常:未找到要写入的元素:java.lang.ArrayIndexOutOfBoundsException:-1

我试图调查这个问题,但没有成功,任何关于导致错误的原因或如何克服错误的建议都非常感谢

public void SplitBySize() throws FileNotFoundException, XMLStreamException, IOException {

    //File Path
    String filePath = "C:\\Users\\thamm\\Desktop\\XMLFile\\Data2.xml";

    //Read XML file.
    Reader fileReader = new FileReader(filePath);

    //Get XMLInputFactory instance.
    XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();

    //Create XMLEventReader object.
    XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(fileReader);

    long charCount = 0;
    int fileNumber = 1;

    while (xmlEventReader.hasNext()) {

        XMLEvent event = xmlEventReader.nextEvent();
        charCount++;
        output.add(event);

        if (charCount == MAX_SIZE) {

            XMLEventWriter xmlEventWriter = factory.createXMLEventWriter(new FileWriter("C:\\Users\\thamm\\Desktop\\SplitFiles\\output_part_" + fileNumber + ".xml"));

            for (XMLEvent i : output) {
                xmlEventWriter.add(i);
            }

            xmlEventWriter.close();
            output.clear();
            charCount = 0;
            fileNumber++;

        }

        if (event.isEndDocument()) {

            XMLEventWriter xmlEventWriter = factory.createXMLEventWriter(new FileWriter("C:\\Users\\thamm\\Desktop\\SplitFiles\\output_part_End.xml"));

            for (XMLEvent i : output) {
                xmlEventWriter.add(i);
            }
            xmlEventWriter.close();
            output.clear();
        }
    }
}

假设
output
是类中定义的
List
,我认为您的问题在于使用
output.clear()
两次

第一次使用
output.clear()
是可以的,因为之前添加了一个元素

output.add(event);
但第二次,
输出
为空

解决方案

  • 在使用类似于
    output.isEmpty()的
    output.clear()
    之前,需要检查
    output
    是否为空

  • 您可能忘记在清除列表之前将元素添加到列表中


你好,米克尔,谢谢你的回复。。我已经调试了该程序,以查看第二个循环的输出是否为空,但其已成功清除,并且正在再次添加XMLEvents。导致异常的行是什么?对于(XMLEvent i:output){xmlEventWriter.add(i);},问题似乎在这里。。我添加了xmlWriter.flush();在调试时查看每个输出,程序开始将元素输出到第二个文件,但在输出2个元素后抛出错误,程序终止