2012-04-11 43 views
1

我試圖做一個程序來壓縮文件是.tar.gz:的tar.gz壓縮沒有爲GIF文件工作

下面是代碼:

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. Compare GIF, From Left to Right -> Code Above, PeaZip, File Input
  2. Compare PDF, From Left to Right -> Code Above, PeaZip, File Input

如果輸入的文件,如果我們使用PeaZip是GIF的壓縮文件增加的大小,相同的。但是對於其他文件,它適用於壓縮過程。

任何人都可以解釋這是怎麼回事?我的代碼有問題嗎?

謝謝您的幫助...

+1

歡迎來到SO。 +1,寫得很好,寫得很好。我也許也應該-1,因爲它是一個非常有名的壓縮特性,它只能使用一次。正如所有答案指出的那樣,壓縮已壓縮的東西可能會使其變大,而不是變小。但我會給你-1的疑問的好處;-) – 2012-04-11 03:25:20

+0

有沒有什麼建議如果我想在不降低尺寸的情況下縮小GIF文件大小,我該怎麼辦?只是一個關鍵字,它會對我有所幫助:) – Crazenezz 2012-04-11 03:34:39

+0

正如所有的答案所說,你不能這樣做。 GIF文件已經被壓縮了,因爲它們可以得到。你可能會發現一種異常的壓縮算法,可以再擠1%,但這就是你將得到的所有東西。這是不值得的努力。如果你想要更多的壓縮,你應該檢查低質量設置的JPEG。 – 2012-04-11 03:39:31

回答

3

根據您使用的壓縮算法,您會得到不同的結果 - 每種類型的文件壓縮方式不同。例如,文本文件壓縮得非常好。另外,由於GIF文件已經使用LZW壓縮進行壓縮,所以第二次壓縮應該幾乎沒有效果。

來自維基百科,「使用Lempel-Ziv-Welch(LZW)無損數據壓縮技術壓縮GIF圖像以減小文件大小而不會降低視覺質量。」

有關更多信息,請參見http://en.wikipedia.org/wiki/Graphics_Interchange_Format

2

GIF文件已經壓縮(LZW用),這樣你就不會再次壓縮他們獲得多大的改善(這是信息的基本「法」理論)。

實際上,您可能會以及發現文件大小增加,因爲雖然無法再壓縮數據,但您仍然需要添加另一層壓縮控制信息。

這可能是什麼發生在你的情況。

2

壓縮僅適用於內容可以壓縮的情況。大多數GIF文件已經被LZW壓縮,所以它們通常不會壓縮得太多;一旦包含歸檔頭和壓縮數據表,淨更改就是文件大小的增加。許多PDF文件也被壓縮,所以你經常會看到同樣的情況。在這種情況下,PDF足夠大,以至於GZip壓縮(相同LZW算法的稍微更新版本)可以找到更多的東西來擠出來。

3

GIF和PDF文件都已經很好地壓縮了,所以LZW算法(如果我沒記錯的話,用在boh Zip和GZip中)無法獲得更多。

想象一下,如果每個文件都可以被壓縮。然後,我們可以反覆運行gzip,直到該文件像我們想要的那樣小:-)