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