如题:源文件为一个.del文本文件,在压缩后文件末尾总是会丢失一部分数据,请高手帮我看一下代码,是哪里出错了?
public static void zip(String fileName) throws FileNotFoundException,IOException,ZipException{
//获取文件后缀,包括"."
String suffix = fileName.substring(fileName.lastIndexOf("."));
String zipFileName = fileName.replace(suffix, ".zip");
File srcFile = new File(fileName);
File zipFile = new File(zipFileName);
if(!srcFile.exists()){
throw new FileNotFoundException("指定的源文件不存在!");
}
BufferedInputStream in = null;
ZipOutputStream zipOut = null;
try {
// 创建字节输入流对象
in = new BufferedInputStream(new FileInputStream(srcFile));
// 创建文件输出流对象
FileOutputStream f = new FileOutputStream(zipFile);
CheckedOutputStream ch = new CheckedOutputStream(f, new CRC32());
// 创建ZIP数据输出流对象
zipOut = new ZipOutputStream(
new BufferedOutputStream(ch, 4096));
// 创建指向压缩原始文件的入口
ZipEntry entry = new ZipEntry(srcFile.getName());
zipOut.putNextEntry(entry);
// 向压缩文件中输出数据
byte[] b = new byte[4096];
int count = -1;
while ((count = in.read(b)) != -1) {
zipOut.write(b,0,count);
}
zipOut.closeEntry();
throw new IOException("error");
} catch (IOException e) {
// 如果抛出异常,则删除生成的压缩文件
if(zipFile != null && zipFile.exists()){
zipOut.close();zipFile.delete();
}
throw e;
} finally {
// 关闭创建的流对象
if(in != null)
in.close();
if(zipOut != null)
zipOut.close();
}
}
文件压缩前后对比截图:
问题补充:
但是我用winrar查看压缩文件,里面的数据确实不完整啊
问题补充:
但是我用winrar查看压缩文件,里面的数据确实不完整啊,就像那个截图
问题补充:
我用的是ant.jar,会不会是这里出了问题?
问题补充:
问题找到了,这段代码本身没有问题,是外层调用的方法写错了,主要是太大意了,外层方法是首先从数据库中把数据读出来写入.del文件,然后再调用这个方法将.del文件压缩。在调用这个方法的时候,外层方法里面没有将.del文件对应的输出流关闭,也没有调用flush()方法,所以文件末尾的一部分数据其实还在缓冲区中,根本都还没有写到文件中呢,怎么能指望在输入流中把这部分数据得到呢?呵呵,这个错误还是比较低级的,谢过了。

