6

解凍する必要がある .gz ファイルが 100 個あります。いくつか質問があります

a) http://www.roseindia.net/java/beginners/JavaUncompress.shtmlにあるコードを使用して .gz ファイルを解凍しています。その正常に動作します。クエスト:- 圧縮されたファイルのファイル名を取得する方法はありますか? JavaのZipクラスが、作業するエントリファイルの列挙を提供することを知っています。これにより、.zip ファイルに保存されているファイル名、サイズなどがわかります。しかし、.gz ファイルについても同じですか、それともファイル名が filename.gz と同じで .gz が削除されていますか。

b)Javaコードでユーティリティ関数を呼び出して.gzファイルを解凍する別のエレガントな方法はありますか. Java クラスから 7-zip アプリケーションを呼び出すようなものです。そうすれば、入出力ストリームについて心配する必要はありません。

前もって感謝します。カピル

4

6 に答える 6

10

a)Zipはアーカイブ形式ですが、gzipはそうではありません。したがって、(たとえば)gzファイルが圧縮されたtarファイルでない限り、エントリイテレータはあまり意味がありません。あなたが欲しいのはおそらく:

File outFile = new File(infile.getParent(), infile.getName().replaceAll("\\.gz$", ""));

b)ファイルのみを解凍しますか?そうでない場合は、GZIPInputStreamを使用してファイルを直接、つまり中間解凍せずに読み取ることができます。

しかし、わかりました。本当にファイルを解凍したいだけだとしましょう。もしそうなら、あなたはおそらくこれを使うことができます:

public static File unGzip(File infile, boolean deleteGzipfileOnSuccess) throws IOException {
    GZIPInputStream gin = new GZIPInputStream(new FileInputStream(infile));
    FileOutputStream fos = null;
    try {
        File outFile = new File(infile.getParent(), infile.getName().replaceAll("\\.gz$", ""));
        fos = new FileOutputStream(outFile);
        byte[] buf = new byte[100000];
        int len;
        while ((len = gin.read(buf)) > 0) {
            fos.write(buf, 0, len);
        }

        fos.close();
        if (deleteGzipfileOnSuccess) {
            infile.delete();
        }
        return outFile; 
    } finally {
        if (gin != null) {
            gin.close();    
        }
        if (fos != null) {
            fos.close();    
        }
    }       
}
于 2009-05-24T02:15:08.243 に答える
2

A に関しては、このコマンドは元の名前からサフィックスgunzipを除いた圧縮されていないファイルを作成します。マニュアルページ.gzを参照してください。

Bについては、特にgunzipが必要ですか、それとも別の圧縮アルゴリズムが必要ですか? ファイルを作成するために 7zip で使用される LZMA 圧縮アルゴリズムのJavaポート.7zがありますが、ファイルを処理しません.gz

于 2009-05-23T06:42:56.223 に答える
0

一度解凍するファイルの数が決まっている場合は、既存のツールを使用してみませんか?ポール・モリーが気づいたように、それgunzipを行うことができます: for i in *.gz; do gunzip $i; done そしてそれは自動的にそれらに名前を付け、ストリッピングします.gz$

Windowsでは、おそらくwinrarを試すか、http: //unxutils.sf.netgunzipから試してください。

于 2009-05-23T06:54:00.713 に答える
0

GZipは通常、単一のファイルでのみ使用されるため、通常、個々のファイルに関する情報は含まれていません。複数のファイルを1つの圧縮アーカイブにバンドルするには、最初にそれらを非圧縮のTarファイル(個々のコンテンツに関する情報を含む)に結合してから、単一のファイルとして圧縮します。この組み合わせはTarballと呼ばれます。

ZipEntriesの場合と同様に、Tarから個々のファイル情報を抽出するためのライブラリがあります。一例。 最初に.gzファイルを一時ファイルに抽出して使用するか、少なくともGZipInputStreamをTarライブラリにフィードする必要があります。

Javaを使用してコマンドラインから7-Zipを呼び出すこともできます。7-Zipコマンドライン構文は次のとおりです。7-Zipコマンドライン構文。 Javaからコマンドシェルを呼び出す例:Javaでシェルコマンドを実行します。 7-Zipを2回呼び出す必要があります。1回は.tar.gzまたは.tgzファイルからTarを抽出し、もう1回はTarから個々のファイルを抽出します。

または、簡単なことを実行して、解凍を実行するための簡単なシェルスクリプトまたはバッチファイルを作成することもできます。丸い穴に四角いペグを打ち込む理由はありません-これがバッチファイルの目的です。ボーナスとして、パラメータをフィードして、Javaコマンドラインの実行の複雑さを大幅に軽減しながら、Javaで実行を制御することもできます。

于 2009-05-23T06:55:19.040 に答える
0

やってみました

gunzip *.gz
于 2009-05-23T07:41:08.370 に答える
0

.gz ファイル (gzip 圧縮) には、圧縮ファイルのファイル名を格納できます。たとえば、FuBar.doc を myDocument.gz 内に保存し、適切な圧縮解除を行うと、ファイルを FuBar.doc というファイル名に復元できます。残念ながら、java.util.zip.GZIPInputStream は、ファイル名がアーカイブ内に保存されている場合でも、ファイル名を読み取る方法をサポートしていません。

于 2010-04-24T01:30:30.207 に答える