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

关于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
    hunterli0408 2009-08-03 13:00
    已采纳

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

    点赞 评论
  • hunterli0408
    hunterli0408 2009-08-03 13:42

    我用rar查看和解压文件都没有问题。有点怪 8)

    点赞 评论
  • qq_19865749
    Liekkas_BX 2019-05-06 14:19

    恨感谢,解决我的问题^_^

    点赞 评论

相关推荐