首页 > 解决方案 > 在 Java 中使用多线程解析 XML

问题描述

我使用 JAXB 在 java 中读取大约 4 GB 的大型 XML,我有一个带有 SSD、RAM 和多个 CPU 内核的良好系统。我想使用多个线程读取该 XML 文件。我已经研究过了,但还没有找到任何解决方案。

我在想,如果我可以使用多个线程读取 XML 并发送字节块以通过 XML 解析器进行解析,那会很好,但想知道是否已经有了实现的解决方案。

我的代码片段是

public void parseXML() throws Exception{

    try(InputStream is = new BufferedInputStream(new FileInputStream(xmlFile),XML_READ_BUFFER)){
    //try(InputStream is = new ByteArrayInputStream(removeAnd.getBytes(StandardCharsets.UTF_16))){ 
        XMLInputFactory xmlif = XMLInputFactory.newInstance();
        XMLStreamReader sr = xmlif.createXMLStreamReader(is);

        JAXBContext ctx = JAXBContext.newInstance(XwaysImage.class);
        Unmarshaller unmar = ctx.createUnmarshaller();

        int c=0;
        while (sr.hasNext()){

            while(this.pause.get())Thread.sleep(100);
            if(this.cancel.get()) break;

            int eventType = sr.next();
            if(eventType == XMLStreamConstants.START_ELEMENT){
                if("ImageFile".equals(sr.getName().getLocalPart())){
                    XwaysImage xim = unmar.unmarshal(sr,XwaysImage.class).getValue();
                    //TODO code here. 
                }
            }
        }
        sr.close();
        is.close();
    }catch(Exception e){
        log.error("",e);
    }
}

标签: javaxmlmultithreadingxml-parsing

解决方案


不确定我是否完全理解您需要并发的代码部分,但如果是您的 while 循环,您可以尝试:

    sr.parallelStream().forEach(-> {
     //do something
})

推荐阅读