在内存中创建ZIP文件

时间:2017-07-27 14:43:57

标签: java zip

我需要创建一个ZIP文件,其中包含即时创建且文件系统没有持久性的文件。

例如:我想在内存中创建一个SQLite数据库,在用数据填充之后我想将它添加到一个 - 还不存在的 - ZIP文件中,而不是我想将这个ZIP文件实际写入文件系统。

我找到了几种方法,其中必须从文件系统中读取将成为存档内容的文件。

有没有办法存档我想做的事情?我希望compress-commons会帮助我,但显然他们没有。

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

如果您尝试压缩的内存对象是可序列化的,那么这很容易。

您可以使用任何可序列化的实例并将其转换为byte[]。我有一个实用方法来做到这一点:

public static byte[] convertToBytes(Object object) throws IOException {
    try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutput out = new ObjectOutputStream(bos)) {
        out.writeObject(object);
        out.flush();
        return bos.toByteArray();
    }
}

一旦你有一个以字节为单位表示的对象,你可以使用ZipOutputStream来压缩它:

try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
         GZIPOutputStream out = new GZIPOutputStream(bos); ) {
    out.write(bytes);
    out.finish();
    byte[] compressed = bos.toByteArray(); // this is my compressed data
}

(为简单起见,我在这里使用Gzip,但你也可以创建一个包含多个条目的zip。)