原因在于StreamEncoder的ensureOpen方法,判断了该流在执行中是否是开启的。
出现问题的代码:
try {
while((entry = zin.getNextEntry())!=null && !entry.isDirectory()){
dstFile = new File(dstPlace, entry.getName());
if(!dstFile.exists()){
(new File(dstFile.getParent())).mkdirs();
}
outs = new BufferedOutputStream(new FileOutputStream(dstFile));
byte[] buf = new byte[BUFFSIZE];
int count = -1;
while ((count = bin.read(buf)) != -1) {
outs.write(buf, 0, count);
outs.flush();
}
outs.close();
zin.close();
}
} finally {
if (zin != null) {
try {
zin.close();
} catch (Exception e) {
}
}
if (outs != null) {
try {
outs.close();
} catch (Exception e) {
}
}
}
Exception in thread "main" java.io.IOException: Stream closed
at java.util.zip.ZipInputStream.ensureOpen(ZipInputStream.java:67)
at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:116)
at com.rys.bank.receipt.util.SignUtil.uncompress(SignUtil.java:240)
at com.rys.bank.receipt.util.FileEncryptTest.main(FileEncryptTest.java:38)
修正后的代码:
try {
while((entry = zin.getNextEntry())!=null && !entry.isDirectory()){
dstFile = new File(dstPlace, entry.getName());
if(!dstFile.exists()){
(new File(dstFile.getParent())).mkdirs();
}
outs = new BufferedOutputStream(new FileOutputStream(dstFile));
byte[] buf = new byte[BUFFSIZE];
int count = -1;
while ((count = bin.read(buf)) != -1) {
outs.write(buf, 0, count);
outs.flush();
}
outs.close();
}
bin.close();
zin.close();
} finally {
if (outs != null) {
try {
outs.close();
} catch (Exception e) {
}
}
if (zin != null) {
try {
zin.close();
} catch (Exception e) {
}
}
}