Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在内存中创建ZIP文件_Java_Zip - Fatal编程技术网

Java 在内存中创建ZIP文件

Java 在内存中创建ZIP文件,java,zip,Java,Zip,我需要创建一个ZIP文件,该文件由动态创建的文件组成,并且在文件系统上没有持久性 例如:我想在内存中创建一个SQLite数据库,在用数据填充它之后,我想将它添加到一个尚未存在的ZIP文件中,然后我想将这个ZIP文件实际写入文件系统 我发现了几种从文件系统读取文件的方法,这些文件将成为归档文件的内容 有没有办法把我想做的事情存档?我希望压缩commons能对我有所帮助,但显然没有 我遗漏了什么吗?如果您试图压缩的内存中对象是可序列化的,那么这很容易 您可以获取任何可序列化实例,并将其转换为字节[]

我需要创建一个ZIP文件,该文件由动态创建的文件组成,并且在文件系统上没有持久性

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

我发现了几种从文件系统读取文件的方法,这些文件将成为归档文件的内容

有没有办法把我想做的事情存档?我希望
压缩commons
能对我有所帮助,但显然没有


我遗漏了什么吗?

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

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

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();
    }
}
一旦有了以字节表示的对象,就可以使用ZipOutStream对其进行压缩:

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)。

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

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

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();
    }
}
一旦有了以字节表示的对象,就可以使用ZipOutStream对其进行压缩:

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)。

要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题可能会导致堆栈溢出,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决问题所做的工作。您可以创建一个临时文件夹,将文件保存到其中,压缩文件并在操作后将其删除问题询问我们推荐或查找书籍、工具、软件库,教程或其他非站点资源对于堆栈溢出来说是非主题的,因为它们往往会吸引固执己见的答案和垃圾邮件。您可以创建一个临时文件夹,将文件保存到其中,压缩文件,然后在操作后将其删除谢谢您的回答!使用这种方法是否可以将多个文件放在不同的文件夹中?我确实希望有一个内存中的解决方案,因为一些文件应该加密,并且文件系统上不应该有未加密版本的文件。如果你想在zip中有一个目录结构,那么是的,我相信通过使用适当的ZipEntry对象是可能的。谢谢你的回答!使用这种方法是否可以将多个文件放在不同的文件夹中?我确实希望有一个内存中的解决方案,因为一些文件应该加密,并且文件系统上不应该有未加密版本的文件。如果您想在zip中有一个目录结构,那么是的,我相信通过使用适当的ZipEntry对象,这是可能的。