通过独立的块压缩文件,然后将它们合并为一个有效的存档

时间:2019-01-02 18:57:20

标签: java compression gzip

我想知道是否有可能通过独立的块来压缩任意文件(或文件夹,或任何其他文件结构),然后通过将它们串联在一起获得有效的归档文件(例如gzip)。一些要求:

  • java 8
  • 块<= 16MB
  • 文件夹结构在此过程中不会改变
  • 块被独立压缩,但顺序得以保留
  • 每个压缩块都附加到生成的归档文件的末尾
  • 生成的存档应该是有效的,并且可以通过任何标准工具进行解压缩

看来要实现这一点,我需要先创建一个存档头,然后将压缩后的块附加到其上https://tools.ietf.org/html/rfc1952,但是我不确定标准Java utils或3rd是否支持它政党图书馆。有人对从哪里开始有任何想法吗?

一些背景: 我有一个客户端服务器应用程序,允许用户将文件上传到云存储。通过REST API进行通信,客户端将负责将文件划分为多个块,并一一上传。可以在浏览器中进行压缩,但是我想知道是否可以将该负载移动到后端。

2 个答案:

答案 0 :(得分:0)

您可以为tar + gzip尝试以下操作:

Maven依赖项:

BaseHuman

要压缩成块的Java代码:

public int MathLevel
{
    get => user.Skills [0].Level;
    set
    {
        user.Skills [0].Level = value;
        OnPropertyChanged("MathLevel");
    }
}

将这些代码块合并为单个存档的Java代码:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-compress</artifactId>
    <version>1.18</version>
</dependency>

答案 1 :(得分:0)

是的。根据标准(RFC 1952),串联的gzip文件是有效的gzip文件。 gzip当然可以解决这个问题。

您应该担心那里的某些代码可能不支持它,因为并置gzip成员并不常见。如果您想超级安全,可以将gzip文件合并为一个gzip成员,而无需重新压缩。但是,您确实需要通读所有压缩的数据,以有效地在内存中对其进行解压缩(这仍然比压缩要快得多)。您可以在gzjoin.c中找到一个示例。