2017-07-27 204 views
0

我需要创建一个ZIP文件,其中包含在运行中创建并且在文件系统上没有持久性的文件。在内存中创建ZIP文件

例如:我想在内存中创建一个SQLite数据库,填充数据后我想将它添加到 - 尚不存在的ZIP文件中,并且要将该ZIP文件实际写入文件系统。

我发现了几种方法,文件将成为档案的内容,必须从文件系统中读取。

实际上有一种方法可以将我想要做的事情归档吗?我希望compress-commons会帮助我,但显然他们不会。

我想念什么?

+1

问题要求我们推荐或找到一本书,工具,软件库,教程或其他非现场资源,因为它们倾向于吸引自以为是的答案和垃圾邮件,因此无法用于Stack Overflow。相反,请描述问题以及到目前为止解决问题所做的工作。 – JFPicard

+0

你可以创建一个临时文件夹,将文件保存到它,压缩并在操作后删除它 – Lino

回答

1

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

您可以采取任何可序列化的实例并将其变为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文件)。

+0

感谢您的回答!使用这种方法可以在不同的文件夹中包含多个文件吗?我确实希望有一个内存中的解决方案,因为有些文件应该被加密,文件系统上不应该有未加密的文件版本。 – Hannes

+0

如果你的意思是在zip中有一个目录结构,那么是的,我相信这可以通过使用[ZipOutputStream](https://docs.oracle.com/javase/8/docs/api/index.html?java /util/zip/ZipOutputStream.html)和适当的ZipEntry对象。 –