如题:源文件为一个.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()方法,所以文件末尾的一部分数据其实还在缓冲区中,根本都还没有写到文件中呢,怎么能指望在输入流中把这部分数据得到呢?呵呵,这个错误还是比较低级的,谢过了。