gpt4 book ai didi

Java Xerces java.lang.ArrayIndexOutOfBoundsException : 8192

转载 作者:行者123 更新时间:2023-11-30 03:57:05 25 4
gpt4 key购买 nike

我的程序使用javax.xml.stream.XMLStreamReader对来自维基词典的非常大的 XML 文件(例如 4Gb)执行 StAX 解析。

它适用于很长的标签和内容序列,然后它会引发一个非常奇怪的异常:

java.lang.ArrayIndexOutOfBoundsException: 8192
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:546)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1753)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1629)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java:1667)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1755)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2965)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117)
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:558)
at XmlParser.getAllTitles(XmlParser.java:36)
at Main.main(Main.java:9)

给出此异常的标签看起来非常正常( </username> ),所以我不明白为什么。

我在互联网上读到其他人也经历过这个问题,看来为了解决这个问题我必须更新 Xerces 版本。我当前的 Xerces 版本是:Xerces-J 2.7.1

我使用这个版本的 Java:

java version "1.7.0_51"
OpenJDK Runtime Environment (IcedTea 2.4.4) (7u51-2.4.4-0ubuntu0.13.10.1)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)

我需要的是要么让 2.7 版本的 Xerces 以某种方式工作,要么更新 OpenJDK 使用的版本。

我深入寻找解决方案,但没有找到任何解决方案,所以我不知道在这两种情况下该怎么做。

最佳答案

我不相信 xerces (2.11) 的最新版本包括 JAXP XMLStreamReader 的实现供您切换。

为了处理大型 xml 文件,我建议切换到 SAX parser这对您来说是更多的工作,但应该以最小的内存占用来处理大型 XML。使用 JRE 1.7+ 从 com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl 切换到 org.apache.xerces.jaxp.SAXParserImpl 应该只需要添加最新的 xerces-j 中的新 xercesImpl.jar + xml-apis.jar到类路径。您可以查看您拥有哪一个:

SAXParserFactory parserFactor = SAXParserFactory.newInstance();
SAXParser parser = parserFactor.newSAXParser();
System.out.println("Parser class: " + parser.getClass().toString());

alternate Stax parser也是一个选项

关于Java Xerces java.lang.ArrayIndexOutOfBoundsException : 8192,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22891411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com