在 linux下 用 tar -zvf 包名.tar.gz  包文件1  包文件2 
打相应的tar.gz包在windows 下显示压缩率为 31%
但是用java相应api打出来的tar.gz包在windows下显示压缩率为30% 所以用java相应api打出来的tar.gz比linux上打的tar.gz包小0.5M左右 
现在想解决的问题是用java相应api打出来的包要和linux打的包一致,在java中用了不少方法都不行.怎样在java打tar.gz包时调整压缩率,就是怎样才能和linux打的tar.gz包一致。java代码如下:
使用的第三方apache commons-compress类包 /**
     * 
     * @Title: pack
     * @Description: 将一组文件打成tar包
     * @param sources
     *            要打包的原文件数组
     * @param target
     *            打包后的文件
     * @return File 返回打包后的文件
     * @throws
     */
    public static File pack(File[] sources, File target) {
        FileOutputStream out = null;
        try {
            out = new FileOutputStream(target);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }
        
        TarArchiveOutputStream os = new TarArchiveOutputStream(out);
        for (int i = 0; i < sources.length; i++) {
            String str = sources[i].toString();
            File file = new File(str);
            try {
                System.out.println("file:" + file);
                os.putArchiveEntry(new TarArchiveEntry(file));
                FileInputStream temp = new FileInputStream(file);
                IOUtils.copy(temp, os);
                os.closeArchiveEntry();            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (os != null) {
            try {
                os.flush();
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }        return target;
    }
 /**
     * 再将tar包 压成tar.gz包
     * <功能详细描述>
     * @param destFile
     * @see [类、类#方法、类#成员]
     */
    private static void compressTarGz(String destFile)
    {
        File target = new File(destFile+".gz");
        //GzipCompressorOutputStream  gzipOut = null;
        GZIPOutputStream gzipOut= null; 
        InputStream is2 = null;
        try
        {
            //gzipOut = new GzipCompressorOutputStream(new FileOutputStream(target));//两个选一
            
            gzipOut = new GZIPOutputStream(new FileOutputStream(target));
            
            is2 = new FileInputStream(new File(destFile));
            IOUtils.copy(is2, gzipOut);  
        }
        catch (FileNotFoundException e)
        {
            
            e.printStackTrace();
        }
        catch (IOException e)
        {
           
            e.printStackTrace();
        }finally
        {
            IOUtils.closeQuietly(is2);  
            IOUtils.closeQuietly(gzipOut);  
        }
    }

解决方案 »

  1.   

    应该可以指定压缩率的吧形如7z,WinRAR在打包大部分格式的时候都有压缩率的选择
      

  2.   

    你用winrar看看里面的原始文件大小是不是一致的。compress做tar打包时貌似对文件的 <LF> <CR> (0x0D 0x0A)会有修改。
      

  3.   

    上面说法有问题,自己搞错了。试了下linux下的gzip,然后再看GZIPOutputStream, 比对 gzip的定义:http://www.ietf.org/rfc/rfc1952.txt感觉java的实现很多都省略掉了。至少文件名没有定义到.gz里。想要定义压缩比,只能重写GZIPOutputStream。就算是重写了,我发现即使压缩比和linux一样,大小也是对不上的。后面有时间再深入研究下。
      

  4.   

    3楼的朋友,你是怎样重写GZIPOutputStream ? 会不会java的压缩算法和linux下的gzip算法不一样呢?
    我解决不了这个问题呀,如果谁能解决我万分感谢呀
      

  5.   

    GZIP是不会保存文件名的
    Java 中的 GZIP 与 linux 下的 都可以指定压缩率的。不一样很正常,压缩率高,压缩时间长,就看你要时间呢,还是要空间。