最近做项目,解析文档,在做zip压缩文件时遇到解析xml和解析html时出现流关闭的问题,弄了几天,没有弄出个究竟来。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;import XmlExtractBySAX.XmlExtractor;public class ZipExtract {
public static void main(String[] args) {
ZipExtract zip = new ZipExtract();
StringBuffer text = new StringBuffer();
InputStream is;
try {
is = new FileInputStream("c:\\test.zip");
int n = zip.getText(is,text);
System.out.println(text);
} catch (FileNotFoundException e) {

e.printStackTrace();
}
}
/**
 * 
 * @param is
 * @param text
 * @return
 */ private int getText(InputStream is, StringBuffer text) {
ZipInputStream zipis = new ZipInputStream(is);
ZipEntry  zipEntry = null;
try {
while((zipEntry = zipis.getNextEntry())!= null) {
//如果为文件夹
if(zipEntry.isDirectory()) {
continue;
}
//获取文件名字
String fileName = zipEntry.getName();
//判断文件类型,这里只写出解析xml的文档
String fileType = fileName.substring(fileName.indexOf('.'));
if(fileType.equalsIgnoreCase(".xml")) {
XmlExtractor xml = new XmlExtractor();
xml.getText(zipis,text);
}

}
} catch (IOException e) {

e.printStackTrace();
}
return 0;
}
}报错为:
java.io.IOException: Stream closed
at java.util.zip.ZipInputStream.ensureOpen(Unknown Source)
at java.util.zip.ZipInputStream.getNextEntry(Unknown Source)
at ZipExtractByJDK.ZipExtract.getText(ZipExtract.java:39)
at ZipExtractByJDK.ZipExtract.main(ZipExtract.java:19)
 
查看跟踪流,发现zip流的参数
在调用解析xml或是解析html的parser函数时
closed 由false变为true;不知道是怎么回事,这流出了问题,解析zip中的其他没有解析的文件就没法了。
请大家帮个忙,看看是怎么回事啊。

解决方案 »

  1.   

    ZipEntry  zipEntry = null; 
    是你的这句错了
     
    你把他都定义为空值,他就是空的,怎可能会被压缩(他没有内容)压缩就是0kb
    你陷入进去的zipInputStream没有问题
      

  2.   

    现在我知道怎么解决了哦!
    也不是你说的那个问题。我那样定义应该没有问题。
    现在我的解决办法是,把那流(zip)分离出来(这是我的架构师给我说的)。
    其实我认真去看了下解析xml和html文档的java类库API才发现SAXParser的
    解析流不能重新用。测试结果是把流给关掉了!解决办法为
    重写InputStream 类的抽象方法,具体如下://定义新的类
    class XmlInputStream {
      InputStream is = null;
      public class XmlInputStream(InputStream is){
         this.is = is;
      }
      //重写read()方法
      public int read(){
         return is.read();
      }
    }这样在遇到xml或是html文档时,就到用该类的实例对象,解析xml和html时,流关掉了,也就管不到zip的流了。