使用Java将数据附加到gzip文件

时间:2012-06-07 02:11:50

标签: java gzip append

我有一个可能很大的日志文件(> 4GB),所以我想“快速抓取它”,这意味着我想直接在gzip文件的末尾插入文本(我想创建)我自己的文件追加器用于logback)。 是否可以将内容附加到现有的gzip文件中?看起来唯一的方法是用GZIPInputStream打开现有的,读取它并用GZIPOutputStream在新文件中写入数据并在新文件的末尾附加新的东西,然后我想删除旧的gzip并重命名新的名字......

我错了吗?更好的想法?

谢谢!

4 个答案:

答案 0 :(得分:2)

您可以查看zlib发行版中的示例,了解如何附加到gzip文件以及如何为日志条目创建不断增长的gzip文件。您可以从zlib.net获取zlib分布,并查看examples/gzappend.cexamples/gzlog.cexamples/gzlog.h。它们是用C语言编写的,可能需要zlib功能,这些功能使用zlib的java.util.zip接口并不容易。

这些方法不需要重新创建gzip文件。

答案 1 :(得分:2)

gzip格式允许连接到以前的gzip字节流,允许在解压缩时显示为单个字符串。

最后添加gzip数据。

答案 2 :(得分:1)

虽然我不知道这个问题的Java特定解决方案,但是有一些本机系统解决方案(假设您使用* nix并且不关心它不是平台无关的。)这个问题在Unix上/ Linux SE为此提供了一些想法(即压缩环回文件系统):

Add/update a file to an existing tar.gz archive?

答案 3 :(得分:0)

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