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

时间:2014-10-09 08:03:48

标签: java apache-commons-compress

我正在尝试使用Apache Commons Compress来读取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.

文件列表过程是应该花费这么多时间还是我做错了什么? 我也尝试删除所有打印件,但读取文件所需的时间是相同的。

1 个答案:

答案 0 :(得分:1)

这似乎有点偏高。 第一个我要做的就是去掉额外的努力和时间只读取部分。

这意味着在循环中注释掉所有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;
}

我有一个含糊的回忆,Apache Commons Compress在开始时读取整个条目列表,看起来是基于源代码here的情况。

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