【发布时间】:2012-04-11 03:13:42
【问题描述】:
我正在尝试制作一个将文件压缩为 .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 个条件进行测试:
- 压缩 GIF 文件
- 压缩 PDF 文件
我使用PeaZip比较压缩,结果如下:
如果输入文件是 GIF,压缩文件的大小会增加,如果我们使用 PeaZip 也是如此。但对于其他文件,它适用于压缩过程。
谁能解释这会发生什么?我的代码有问题吗?
感谢您的帮助...
【问题讨论】:
-
欢迎来到 SO。 +1 写得很好,有据可查的问题。我可能也应该 -1 因为不使用谷歌搜索,因为它是一个非常众所周知的压缩特性,它只工作一次。正如所有答案所指出的那样,压缩已经压缩的东西可能会使其更大,而不是更小。但我会给你对 -1 的怀疑的好处;-)
-
如果我想在不减小尺寸的情况下减小 GIF 文件大小,我有什么建议吗?只是一个对我有帮助的关键字:)
-
正如所有答案所说,你不能这样做。 GIF 文件已尽可能压缩。您可能会发现一种奇特的压缩算法,可以再挤出 1%,但这就是您将得到的全部。这不值得努力。如果你想要更多的压缩,你应该研究低质量设置的 JPEG。
-
感谢您的帮助吉姆 :-)
-
请注意,JPEG 是“有损”的——它会永久丢弃图像中的信息,但可以实现更高的压缩系数,具体取决于您可以容忍的图像退化程度。
标签: java file compression