tar.gz compress对GIF文件不起作用

时间:2012-04-11 03:13:42

标签: java file compression

我正在尝试将程序压缩到.tar.gz:

以下是代码:

import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;

public class Compress {

    public static void main(String[] args) {
        BufferedInputStream input = null;
        try {
            input = new BufferedInputStream(new FileInputStream(new File("input_filename.filetype")));
            TarArchiveOutputStream out = null;
            try {
                out = new TarArchiveOutputStream(new GZIPOutputStream(new BufferedOutputStream(new FileOutputStream("output_filename.tar.gz"))));
                out.putArchiveEntry(new TarArchiveEntry(new File("input_filename.filetype")));

                int count;
                byte data[] = new byte[input.available()];
                while ((count = input.read(data)) != -1) {
                    out.write(data, 0, count);
                }

                input.close();
            } catch (IOException ex) {
                Logger.getLogger(Compress.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                if (out != null) {
                    try {
                        out.closeArchiveEntry();
                        out.close();
                    } catch (IOException ex) {
                        Logger.getLogger(Compress.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Compress.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                input.close();
            } catch (IOException ex) {
                Logger.getLogger(Compress.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

我正在使用Apache Commons Compression作为库。

我测试了2个条件:

  1. 压缩GIF文件
  2. 压缩PDF文件
  3. 我使用PeaZip比较压缩,结果如下:

    1. Compare GIF, From Left to Right -> Code Above, PeaZip, File Input
    2. Compare PDF, From Left to Right -> Code Above, PeaZip, File Input
    3. 如果输入文件是GIF,压缩文件的大小会增加,如果我们使用PeaZip则相同。但对于其他文件,它适用于压缩过程。

      任何人都能解释一下这会发生什么吗?我的代码有问题吗?

      感谢您的帮助......

4 个答案:

答案 0 :(得分:3)

GIF和PDF文件一般都已经很好地压缩了,所以LZW算法(如果我没记错的话,在boh Zip和GZip中使用)不能得到更多。

想象一下,如果每个文件都可以压缩。然后我们可以一遍又一遍地运行gzip,直到文件尽可能小: - )

答案 1 :(得分:3)

根据您使用的压缩算法,您将获得不同的结果 - 每种类型的文件压缩方式都不同。例如,文本文件压缩得非常好。此外,由于GIF文件已经使用LZW压缩进行了压缩,因此第二次压缩应该几乎没有效果。

来自维基百科,“使用Lempel-Ziv-Welch(LZW)无损数据压缩技术压缩GIF图像,以减小文件大小而不降低视觉质量。”

有关详细信息,请参阅http://en.wikipedia.org/wiki/Graphics_Interchange_Format

答案 2 :(得分:2)

GIF文件已经压缩(使用LZW),因此通过再次压缩它们将无法获得很大的改进(这是信息理论的基本“法则”)。 / p>

事实上,您可能很好发现文件大小增加,因为虽然您无法再将数据压缩,但仍需要添加另一层压缩控制信息。

这可能就是你的情况。

答案 3 :(得分:2)

压缩仅在内容可以压缩时有效。大多数GIF文件已经被LZW压缩,因此它们通常不会压缩得更多;一旦包含存档标头和压缩数据表,净更改就是文件大小的增加。许多PDF文件也被压缩,所以你经常会看到相同的情况;在这种情况下,PDF足够大,GZip压缩(相同LZW算法的稍微更新版本)可以找到更多来挤出。