在内存中创建ZIP文件
我需要创建一个ZIP文件,其中包含在运行中创建并且在文件系统上没有持久性的文件。在内存中创建ZIP文件
例如:我想在内存中创建一个SQLite数据库,填充数据后我想将它添加到 - 尚不存在的ZIP文件中,并且要将该ZIP文件实际写入文件系统。
我发现了几种方法,文件将成为档案的内容,必须从文件系统中读取。
实际上有一种方法可以将我想要做的事情归档吗?我希望compress-commons
会帮助我,但显然他们不会。
我想念什么?
如果你想压缩的内存对象是可序列化的,那么这很容易。
您可以采取任何可序列化的实例并将其变为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文件)。
感谢您的回答!使用这种方法可以在不同的文件夹中包含多个文件吗?我确实希望有一个内存中的解决方案,因为有些文件应该被加密,文件系统上不应该有未加密的文件版本。 – Hannes
如果你的意思是在zip中有一个目录结构,那么是的,我相信这可以通过使用[ZipOutputStream](https://docs.oracle.com/javase/8/docs/api/index.html?java /util/zip/ZipOutputStream.html)和适当的ZipEntry对象。 –
问题要求我们推荐或找到一本书,工具,软件库,教程或其他非现场资源,因为它们倾向于吸引自以为是的答案和垃圾邮件,因此无法用于Stack Overflow。相反,请描述问题以及到目前为止解决问题所做的工作。 – JFPicard
你可以创建一个临时文件夹,将文件保存到它,压缩并在操作后删除它 – Lino