1

我正在尝试制作一个将文件压缩为 .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 文件

我比较使用PeaZip进行压缩,结果如下:

  1. 比较 GIF,从左到右 -> 上面的代码,PeaZip,文件输入
  2. 比较 PDF,从左到右 -> 上面的代码,PeaZip,文件输入

如果输入文件是 GIF,压缩文件的大小会增加,如果我们使用PeaZip也是如此。但对于其他文件,它适用于压缩过程。

谁能解释这会发生什么?我的代码有问题吗?

感谢您的帮助...

4

4 回答 4

3

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

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

于 2012-04-11T03:18:36.890 回答
3

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

来自 Wikipedia,“GIF 图像使用 Lempel-Ziv-Welch (LZW) 无损数据压缩技术进行压缩,以在不降低视觉质量的情况下减小文件大小。”

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

于 2012-04-11T03:20:09.720 回答
2

GIF文件已经被压缩(使用 LZW),因此再次压缩它们不会有太大的改进(这是信息论的基本“定律”)。

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

这可能就是你的情况。

于 2012-04-11T03:18:02.550 回答
2

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

于 2012-04-11T03:18:23.633 回答