关于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个回答

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

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐