我有一个可能很大(> 4GB)的日志文件,所以我正在考虑“即时压缩它”,这意味着我想直接在 gzip 文件的末尾插入文本(我想创建自己的文件附加程序用于登录)。是否可以将内容附加到现有的 gzip 文件中?看起来唯一的方法是用 GZIPInputStream 打开现有的,读取它并用 GZIPOutputStream 将数据写入一个新文件中,然后在新文件的末尾附加新的东西,然后我想删除旧的 gzip 并重命名旧名称的新名称...
我错了吗?更好的想法?
谢谢!
传递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
gzip 格式允许连接到以前 gzip 的字节流,允许在解压缩时显示为单个字符串。
只需在末尾附加 gzip 数据即可。
您可以查看 zlib 发行版中的示例,了解如何附加到 gzip 文件以及如何为日志条目制作一个不断增长的 gzip 文件。您可以从zlib.net获取 zlib 发行版,并查看examples/gzappend.c、examples/gzlog.c和examples/gzlog.h。它们是用 C 编写的,并且可能需要 zlib 功能,而使用 zlib 的 java.util.zip 接口不容易获得这些功能。
这些方法不需要重新创建 gzip 文件。
虽然我不知道针对此问题的特定于 Java 的解决方案,但有一些本机系统解决方案(假设您在 *nix 上并且不在乎它不是独立于平台的。)Unix / Linux SE 上的这个问题为此提供了一些想法(即压缩环回文件系统):