2013-04-30 248 views
2

我必须保存一个XML文件。我使用DOm,文件很大,大约为1,3 Gb。这样做我用下面的代码:org.w3c.dom.ls.LSException引发:java.lang.NegativeArraySizeException

public void guardarDocumentoXML() throws FileNotFoundException, IOException { 
    DOMImplementationLS ls = (DOMImplementationLS)documentoXML.getImplementation(); 
    LSSerializer ser = ls.createLSSerializer(); 
    LSOutput out = ls.createLSOutput(); 
    out.setEncoding("UTF-8"); 
    FileOutputStream output = new FileOutputStream(nombrearchivo); 
    try { 
     out.setByteStream(output); 
     ser.write(documentoXML, out); 
    } finally { 
     output.close(); 
    } 
} 

当我试图保存小XML文件我没有问题,但是当我尝试保存一个巨大的文件我收到一个异常:

Exception in thread "AWT-EventQueue-1" org.w3c.dom.ls.LSException 
at org.apache.xml.serializer.dom3.LSSerializerImpl.write(LSSerializerImpl.java:1087) 
at datos.XML_Seguridad.guardarDocumentoXML(XML_Seguridad.java:824) 
at datos.GUI$1ButtonListener.actionPerformed(GUI.java:2100) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6505) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
at java.awt.Component.processEvent(Component.java:6270) 
at java.awt.Container.processEvent(Container.java:2229) 
at java.awt.Component.dispatchEventImpl(Component.java:4861) 
at java.awt.Container.dispatchEventImpl(Container.java:2287) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
at java.awt.Container.dispatchEventImpl(Container.java:2273) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729) 
at java.awt.EventQueue.access$200(EventQueue.java:103) 
at java.awt.EventQueue$3.run(EventQueue.java:688) 
at java.awt.EventQueue$3.run(EventQueue.java:686) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
at java.awt.EventQueue$4.run(EventQueue.java:702) 
at java.awt.EventQueue$4.run(EventQueue.java:700) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:699) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 
Caused by: java.lang.NegativeArraySizeException 
at org.apache.xml.serializer.SerializerBase.characters(SerializerBase.java:958) 
at org.apache.xml.serializer.dom3.DOM3TreeWalker.dispatachChars(DOM3TreeWalker.java:381) 
at org.apache.xml.serializer.dom3.DOM3TreeWalker.serializeText(DOM3TreeWalker.java:1040) 
at org.apache.xml.serializer.dom3.DOM3TreeWalker.startNode(DOM3TreeWalker.java:429) 
at org.apache.xml.serializer.dom3.DOM3TreeWalker.traverse(DOM3TreeWalker.java:272) 
at org.apache.xml.serializer.dom3.DOM3SerializerImpl.serializeDOM3(DOM3SerializerImpl.java:111) 
at org.apache.xml.serializer.dom3.LSSerializerImpl.write(LSSerializerImpl.java:1069) 
... 37 more 

我使用Xerces 2.11库。 你能帮我吗?谢谢

+0

听起来像是在xerces中的错误。在他们的邮件列表上联系他们 – rolfl 2013-04-30 12:30:37

回答

2

Xerces2 Java 2.11.0取决于serializer.jar。在这个图书馆你会发现org.apache.xml.serializer.SerializerBase课程。

代码m_charsBuff = new char\[length * 2 + 1\];(在线958)表明即使长度在某种程度上是负面的(由于bug),那么该数组总是会创建一个正数。 NegativeArraySizeException正在提出的事实是

如果应用程序尝试创建负大小的数组,则会抛出此异常。

暗示由length * 2 + 1计算引起的integer overflow。我相信这是因为提供给DOM解析器的XML文档是非常大

我会考虑使用SAX解析器 - 请参阅What is the difference between SAX and DOM?进行比较。

相关问题