文件过早结束。试图从Zipinputstream解析xml的异常

时间:2012-06-23 00:18:58

标签: xml-serialization xml-parsing xstream zipoutputstream

我正在尝试提取xml文件&来自ZipInputStream的其他内容,并从xml解析zipinputstream创建我的对象。但是我得到文件异常的过早结束 - 对于以下代码或Stream Closed - 当我没有while循环读取inputStream时。据我所知,ZipInputStream.getNextEntry获取下一个输入流条目。

另外 - 当我通过创建一个实际的临时文件来运行它时传递输入流(如在注释代码中) - 它处理正常 - 但在我的情况下,我不能写入磁盘 - 所以这一切都必须发生在内存中。有人能告诉我mycode错在哪里,我该怎么做才能解决它?

ZipEntry entry; 
Map<String, byte[]> otherElements = new HashMap<String, byte[]>();
        entry =((ZipInputStream)inputStream).getNextEntry();
        while (entry != null) {
            logger.debug("entry: " + entry.getName() + ", " + entry.getSize());
            System.out.println(entry.getName() + " - " + entry.getSize());

            if (entry.getName().equalsIgnoreCase("Document.xml")) {
                /*File file = new File("C:\\tmp.xml");
                FileOutputStream fos = new FileOutputStream();
                int read = 0;
                byte[] bytes = new byte[1024];

                while ((read = inputStream.read(bytes)) != -1) {
                    fos.write(bytes, 0, read);
                }
                InputStream fis = new FileInputStream();*/

                while(inputStream.available()>0){
                    inputStream.read();
                }

                myOutput = buildMyOutput((ZipInputStream)inputStream);
                //fos.close();
                //fis.close();

// method that takes the input and creates the java object
private MyObject buildMyOutput(InputStream xmlStream) throws Exception {

    // build my objects
    XStream xstream = ConvertUtil.getXStream();
    xstream.processAnnotations(MyObject.class);
    MyObject myOutput = (MyObject) xstream.fromXML(xmlStream);
    return myOutput;
}

1 个答案:

答案 0 :(得分:0)

发现问题所在: XStream正在丢失编码信息&amp;将其设置为null [Codehaus上的JIRA链接] [1] https://jira.codehaus.org/browse/XSTR-441

基于此输入,我将输入流复制为UTF-8,然后使用UTF-8编码格式调用buildMyOutput方法。 删除了以下代码段 -

 while(inputStream.available()>0){
         inputStream.read();
 }

并更改了buildMyOutput调用,如下所示

String xml = IOUtils.toString(zipInputStream, "UTF-8");
    InputStream documentXmlIS = IOUtils.toInputStream(xml);
    map = buildMyOutput(documentXmlIS);