0

我不知道问题出在哪里...帮助,谢谢!

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8192

在 com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:543) 在 com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:第 1742 章1657) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1740) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl. java:2930) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl。scanDocument(XMLDocumentFragmentScannerImpl.java:510) 在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807) 在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration。在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser 的 com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107) 解析 (XML11Configuration.java:737)。解析(AbstractSAXParser.java:1205)在 com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 在 javax.xml.parsers.SAXParser.parse(SAXParser.java: 395) 在 javax.xml.parsers.SAXParser.parse(SAXParser.java:277) 在 myPackage.MainClass.main(MainClass.java:39)xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 在 com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107) 在 com.sun.org.apache。 xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 在 com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 在 javax.xml.parsers。 SAXParser.parse(SAXParser.java:395) 在 javax.xml.parsers.SAXParser.parse(SAXParser.java:277) 在 myPackage.MainClass.main(MainClass.java:39)xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 在 com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107) 在 com.sun.org.apache。 xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 在 com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 在 javax.xml.parsers。 SAXParser.parse(SAXParser.java:395) 在 javax.xml.parsers.SAXParser.parse(SAXParser.java:277) 在 myPackage.MainClass.main(MainClass.java:39)parse(SAXParserImpl.java:522) 在 javax.xml.parsers.SAXParser.parse(SAXParser.java:395) 在 javax.xml.parsers.SAXParser.parse(SAXParser.java:277) 在 myPackage.MainClass.main(MainClass .java:39)parse(SAXParserImpl.java:522) 在 javax.xml.parsers.SAXParser.parse(SAXParser.java:395) 在 javax.xml.parsers.SAXParser.parse(SAXParser.java:277) 在 myPackage.MainClass.main(MainClass .java:39)

在主类中,代码框架如下:

SAXParserFactory sf = SAXParserFactory.newInstance();   
SAXParser sax = sf.newSAXParser();   
sax.parse("english.xml", new DefaultElementHandler("page"){   
public void processElement(Element element) { 
// process the element
}
}); 

XML文件很大4G,而且全是文本,我需要解析文件并处理文本。

目前,我没有做任何过程部分,只是想在控制台中打印出来。然后OOB...

4

3 回答 3

2

我知道这篇文章已有 10 年历史,但我之所以回答这个问题,是因为这篇 Stack Overflow 帖子是 Google 上的最高结果,遇到此问题的任何其他人都可能需要修复,就像我今天所做的那样。

是的,这是 Xerces 中的一个错误,截至 2020 年 3 月,它仍未修复。但是,解决方法相对简单。

该错误与文件大小无关。Xerces 在某些 4 字节 UTF-8 字符序列方面存在问题。多年来,它已被多次修补。( https://bugs.openjdk.java.net/browse/JDK-8080085 )

根据您的平台,您的 Java 环境可能假定默认编码为 UTF-16。当 Xerces 在 UTF-16 平台上命中这四个字节序列之一时,您会看到显示的异常跟踪。

幸运的是,这很容易解决。错误报告建议的一个简单修复方法是将输入文件中的所有 4 字节 UTF-8 字符转换为数字字符实体。另一种“更正确”的方法是显式指定您的编码......即使它已经在您的 XML 模式中指定,也将其指定为输入流的一部分。

例如,如果您通过 SAX 访问 Xerces,请不要调用SAXParser.parse(filename, handler)它在大多数教程中显示的方式。相反,您需要像这样创建自己的 InputStream:

final SAXParser saxParser = factory.newSAXParser();
File file = new File(filename);
InputStream inputStream = new FileInputStream(file);
Reader reader = new InputStreamReader(inputStream,"UTF-8");                      
InputSource is = new InputSource(reader);
is.setEncoding("UTF-8");                      
saxParser.parse(is, handler);

希望这对某人有帮助!

于 2020-03-29T02:13:53.413 回答
0

您可能想尝试打印出与该堆栈跟踪一起出现的错误消息。您可以通过添加对System.err.println(e.getMessage())where eis exception 的调用来做到这一点。该消息应该为您提供尝试访问的索引。

如果索引为负数,则很可能存在整数溢出。 如果是这种情况,您应该向 Xerces 提交错误报告。Xerces 可能不是为处理那么大的文件而设计的。

于 2009-12-17T06:28:53.537 回答
0

我有同样的问题,指定编码没有帮助。我改用伍德斯托克斯。过渡非常容易。我只需要更改一行代码:

import com.ctc.wstx.stax.WstxInputFactory;

WstxInputFactory xmlInputFactory = WstxInputFactory.newInstance();
于 2021-08-08T23:34:18.557 回答