Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.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,我有一个1-2GB的zip文件,其中包含500-1000k条目。我需要在不完全解包的情况下,在几秒钟内按名称获取文件。如果文件存储在HDD上,则可以正常工作: public class ZipMapper { private HashMap<String,ZipEntry> map; private ZipFile zf; public ZipMapper(File file) throws IOException { map = new H

我有一个1-2GB的zip文件,其中包含500-1000k条目。我需要在不完全解包的情况下,在几秒钟内按名称获取文件。如果文件存储在HDD上,则可以正常工作:

public class ZipMapper {
    private HashMap<String,ZipEntry> map;
    private ZipFile zf;

    public ZipMapper(File file) throws IOException {
        map = new HashMap<>();
        zf = new ZipFile(file);

        Enumeration<? extends ZipEntry> en = zf.entries();
        while(en.hasMoreElements()) {
            ZipEntry ze = en.nextElement();
            map.put(ze.getName(), ze);
        }
    }

    public Node getNode(String key) throws IOException {
        return Node.loadFromStream(zf.getInputStream(map.get(key)));
    }
}
公共类ZipMapper{
私有哈希映射;
私人ZipFile zf;
公共ZipMapper(文件)引发IOException{
map=新的HashMap();
zf=新ZipFile(文件);

枚举您可以在退出时标记要删除的文件

如果您想使用内存中的方法:请看一看新的NIO.2文件API。Oracle为zip/jar提供了文件系统提供程序,而AFAIK提供了内存中的文件系统。您可以尝试两者的组合

我已经编写了一些实用方法,使用NIO.2文件API将目录和文件复制到Zip文件或从Zip文件复制目录和文件(该库是开源的):

马文:

<dependency>  
    <groupId>org.softsmithy.lib</groupId>  
    <artifactId>softsmithy-lib-core</artifactId>  
    <version>0.3</version>  
</dependency>  

org.softsmithy.lib

API:

特别有助于解决跨文件系统的路径问题。


我认为你应该考虑使用你的操作系统来创建“内存”文件系统(即RAM驱动器)。
此外,请查看s API。

您可以使用SecureBackbox库,它允许对任何可查找的流执行ZIP操作。

完全不同的方法:如果服务器已将文件存储在磁盘上(可能已缓存在RAM中):让它为您提供文件直接。换句话说,提交您需要的文件,然后注意提取并在服务器上交付这些文件。

Blackbox library只有extract(字符串名称,字符串输出路径)方法。它似乎确实可以随机访问可查找zip流中的任何文件,但它不能将结果写入字节数组或返回流

我找不到ShrinkWrap的文件和文档。我找不到任何合适的FileSystem/FileSystemProvider等实现

然而,事实证明,我正在运行的AmazonEC2实例(大)以某种方式在大约1秒的时间内将1gb文件写入磁盘,所以我只需将文件写入磁盘并使用ZipFile


如果硬盘速度较慢,我认为RAM磁盘将是最简单的解决方案。

您看过TrueZip库了吗?它可以像普通文件一样访问ZIP条目,如果我没记错的话,还可以通过http访问远程ZIP文件.我下载了库,但在java/zip上找不到任何文档或参考。是的。java文档尚未准备好,但大多数方法与.NET版本的库具有相同的名称,因此您可以在Extract中查看文档。方法只能写入
outputPath
。无法获取字节数组或流。如果outputPath为空字符串,然后对Entry.ExtractionStream进行提取,或者通过一个extractionstreamneed事件进行处理。我认为这是唯一有效的解决方案。我最终向HDD写了一封信,因为在我的情况下,它速度非常快。