2012-06-23 49 views
0

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

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

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; 
} 

回答

0

发现了什么问题是: XStream的是失去的编码信息&设置为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); 
+0

后来我才意识到,真正的罪魁祸首是我的IDE设置默认情况下,而不是系统默认使用UTF-8 。因此,根据您使用的IDE,检查IDE的编码也是值得的(完全无法编程的修复程序性问题!) – conphident4

相关问题