yue_ch 2009-08-03 10:53
浏览 1374
已采纳

关于java文件压缩API(ZipOutputStream),压缩后的文件部分数据丢失的问题

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

3条回答

  • hunterli0408 2009-08-03 13:00
    关注

    运行了一下lz的程序,50kb的文本文件,压缩后再解压,用差分工具比较过,跟原来的完全一致。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿