6

巨大な(> 4GB)ログファイルがあるので、「その場でgzip圧縮する」ことを考えています。つまり、gzipファイルの最後に直接テキストを挿入したいと思います(独自のファイルアペンダーを作成したい)。ログバック用)。既存のgzipファイルに何かを追加することは可能ですか?唯一の方法は、GZIPInputStreamで既存のものを開き、それを読み取ってGZIPOutputStreamで新しいファイルにデータを書き込み、その新しいファイルの最後に新しいものを追加することです。古いgzipを削除して、名前を変更します。古い名前に新しいもの...

私が間違っている?より良いアイデア?

ありがとう!

4

4 に答える 4

4

追加モードを取得するには、コンストラクターの 2 番目の引数にtrue渡します。FileOutputStream

File f = new File("out.gz");
OutputStream os = new GZIPOutputStream(new FileOutputStream(f, true)); // true for append
PrintWriter w = new PrintWriter(new OutputStreamWriter(os));
w.println("log message");

私のサンプル データでは、これはデフォルトの圧縮レベルgzip. (レベル 7 よりわずかに優れていましたが、レベル 8 ほどではありませんでした)。

$ ls -asl out.gz
88 -rw-r--r--  1 jem  staff  41859  5 Jul 07:42 out.gz
$ gunzip out.gz
$ gzip out
$ ls -asl out.gz
88 -rw-r--r--  1 jem  staff  42164  5 Jul 07:42 out.gz
于 2018-07-04T21:59:14.360 に答える
3

gzip 形式では、以前に gzip されたバイト ストリームに連結でき、解凍時に単一の文字列として表示できます。

最後に gzip データを追加するだけです。

于 2012-06-07T03:08:34.767 に答える
1

この問題に対するJava固有の解決策はわかりませんが、ネイティブシステムの解決策がいくつかあります(* nixを使用していて、プラットフォームに依存しないことを気にしないと仮定します)。Unix / Linux SEに関するこの質問これについていくつかのアイデアを提供しています(つまり、圧縮されたループバックファイルシステム):

既存の tar.gz アーカイブにファイルを追加/更新しますか?

于 2012-06-07T02:23:36.957 に答える