Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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 7-zip存档中的文件列表需要几秒钟才能完成_Java_Apache Commons Compress - Fatal编程技术网

Java 7-zip存档中的文件列表需要几秒钟才能完成

Java 7-zip存档中的文件列表需要几秒钟才能完成,java,apache-commons-compress,Java,Apache Commons Compress,我正在尝试使用ApacheCommons压缩来读取7-zip文件的内容。我对阅读/提取内容不感兴趣,我只想得到所有条目的列表 我编写了这段代码,但是使用4MB的归档文件,读取整个文件需要6秒钟 public static void main(String[]args) throws IOException{ File sevenz = new File("testfile.7z"); System.out.println("Reading 7-zip..."); Seve

我正在尝试使用ApacheCommons压缩来读取7-zip文件的内容。我对阅读/提取内容不感兴趣,我只想得到所有条目的列表

我编写了这段代码,但是使用4MB的归档文件,读取整个文件需要6秒钟

public static void main(String[]args) throws IOException{
    File sevenz = new File("testfile.7z");
    System.out.println("Reading 7-zip...");
    SevenZFile sevenZFile = new SevenZFile(sevenz);
    long s = System.currentTimeMillis();
    SevenZArchiveEntry entry;
    while((entry=sevenZFile.getNextEntry())!=null){
        System.out.print(entry.isDirectory()?"Dir":"File");
        System.out.print("\t");
        System.out.print("*********.***"); //entry.getName();
        System.out.print("\t");
        System.out.println(entry.getHasCrc()?"CRC":"NO-CRC");
    }
    System.out.println("------------------------------");
    System.out.println("7-zip\t"+(System.currentTimeMillis()-s)+" ms to read.");

}   
输出为:

Reading 7-zip...
File    *********.***   CRC
File    *********.***   CRC
File    *********.***   CRC
File    *********.***   CRC
File    *********.***   CRC
------------------------------
7-zip   6236 ms to read.
文件列表过程应该花费所有的时间,还是我做错了什么?
我还尝试删除所有打印,但读取文件所需的时间是相同的

这似乎有点偏高。我要做的第一件事是除去无关的努力和时间,只除去阅读部分

这意味着注释掉循环中的所有
System.out.println
命令:

while ((entry = sevenZFile.getNextEntry()) != null) {
}
System.out.println("total\t" + (System.currentTimeMillis()-s) + " ms.");
这样做,看看会不会有什么不同。这将告诉您是条目扫描本身还是打印和/或从每个条目中提取数据

除此之外,您还可以了解每个迭代需要多长时间:

while ((entry = sevenZFile.getNextEntry()) != null) {
    long s2 = System.currentTimeMillis();
    System.out.println("entry\t" + (s2-s) + " ms.");
    s = s2;
}
我模糊地记得,ApacheCommons Compress在开始时读取了整个条目列表,这似乎是基于源代码的情况


一种可能是获取源代码,暂时将其合并到您自己的代码中,然后对其进行分析,以查看实例化过程中的大部分时间都花在何处。

这需要相同的时间。我更改了代码以查看访问每个文件所需的时间,问题在于
getNextEntry
位于最大文件(16MB未压缩)之后。创建
SevenZFile
对象时会生成条目列表,但是
getNextEntry
似乎会“准备”要读取的文件内容,并且没有禁用此选项。也许这就是问题所在。