我需要创建一个ZIP文件,其中包含即时创建且文件系统没有持久性的文件。
例如:我想在内存中创建一个SQLite数据库,在用数据填充之后我想将它添加到一个 - 还不存在的 - ZIP文件中,而不是我想将这个ZIP文件实际写入文件系统。
我找到了几种方法,其中必须从文件系统中读取将成为存档内容的文件。
有没有办法存档我想做的事情?我希望compress-commons
会帮助我,但显然他们没有。
我错过了什么吗?
答案 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。)