0

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.

ファイルの一覧表示プロセスにこれだけ時間がかかるのでしょうか、それとも何か間違っていますか? また、すべてのプリントを削除しようとしましたが、ファイルの読み取りにかかる時間は同じです。

4

1 に答える 1

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に基づく場合のようです。

1 つの可能性は、そのソース コードを取得し、それをそのまま自分のコードに一時的に組み込んでから、プロファイルを作成して、インスタンス化中にほとんどの時間を費やしている場所を確認することです。

于 2014-10-09T08:10:07.160 に答える