6

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

我错了吗?更好的想法?

谢谢!

4

4 回答 4

4

传递trueFileOutputStream构造函数的第二个参数以获取附加模式。

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 回答
3

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

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

于 2012-06-07T02:47:24.597 回答
1

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

将文件添加/更新到现有的 tar.gz 存档?

于 2012-06-07T02:23:36.957 回答