【问题标题】:Append data to a gzip file with Java使用 Java 将数据附加到 gzip 文件
【发布时间】:2023-03-07 05:04:01
【问题描述】:

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

我错了吗?更好的想法?

谢谢!

【问题讨论】:

    标签: java gzip append


    【解决方案1】:

    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
    

    【讨论】:

    • 这行得通!我认为这应该是选择的答案。
    【解决方案2】:

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

    只需在末尾附加 gzip 数据。

    【讨论】:

    • 这对于短日志条目来说不是一个好方法。每个 gzip 文件增加 18 个字节的开销,加上压缩短字符串,例如一个日志条目,一般是无效的。所以你最好只使用一个普通的日志文件。要获得 gzip 压缩的好处,您需要使用我在答案中指出的示例中的技术将其保存在单个 gzip 流中。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-14
        • 2013-08-08
        • 1970-01-01
        • 1970-01-01
        • 2014-07-27
        • 2011-12-15
        相关资源
        最近更新 更多