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 アルゴリズム (私の記憶が正しければ Zip と GZip の両方で使用されます) は、それ以上のものを得ることができません。

すべてのファイルを圧縮できると想像してみてください。次にgzip、ファイルが必要なだけ小さくなるまで何度でも実行できます:-)

于 2012-04-11T03:18:36.890 に答える
3

使用している圧縮アルゴリズムに応じて、異なる結果が得られます。ファイルの種類ごとに圧縮方法が異なります。たとえば、テキスト ファイルは非常によく圧縮されます。また、GIF ファイルはすでに LZW 圧縮を使用して圧縮されているため、2 回目の圧縮はほとんどまたはまったく効果がありません。

ウィキペディアから、「GIF 画像は、Lempel-Ziv-Welch (LZW) ロスレス データ圧縮技術を使用して圧縮され、視覚的な品質を低下させることなくファイル サイズを縮小します。」

詳細については、 http://en.wikipedia.org/wiki/Graphics_Interchange_Formatを参照してください。

于 2012-04-11T03:20:09.720 に答える
2

GIFファイルはすでに(LZW で) 圧縮されているため、再度圧縮してもあまり改善されません (これは情報理論の基本的な「法則」です)。

実際、これ以上データを圧縮することはできませんが、圧縮制御情報の層をもう 1 つ追加する必要があるため、ファイル サイズが大きくなることに気付くかもしれません。

それはおそらくあなたの場合に起こっていることです。

于 2012-04-11T03:18:02.550 に答える
2

圧縮は、コンテンツを圧縮できる場合にのみ機能します。ほとんどの GIF ファイルはすでに LZW 圧縮されているため、通常はそれ以上圧縮することはありません。アーカイブ ヘッダーと圧縮データ テーブルを含めると、正味の変更はファイル サイズの増加になります。多くの PDF ファイルも圧縮されているため、同じことが頻繁に発生します。この場合、PDF は十分に大きいので、GZip 圧縮 (同じ LZW アルゴリズムの少し新しいバージョン) は、もう少し絞り出すことができます。

于 2012-04-11T03:18:23.633 に答える