web-dev-qa-db-ja.com

ハードディスクに保存せずにJavaの7-Zipストリームからファイルを抽出する方法は?

7-Zipバイトストリームからいくつかのファイルを抽出したいのですが、ハードディスクに保存できないため、RandomAccessFileクラスを使用できません。読んだことがありますsevenzipjbindingソースコード、解凍もしますlib7-Zip-JBinding.soのようないくつかのクローズドソースを含むファイルで、他の言語で記述されています。公式パッケージのメソッドSevenZip

SevenZip.Compression.LZMA.Decoder.Code(Java.io.InputStream inStream,Java.io.OutputStream outStream,long outSize,ICompressProgressInfo progress)

解凍できるファイルは1つだけです。

では、どうすれば純粋なJavaで7-Zipバイトストリームを解凍できますか?

誰かが解決策を持っていますか?

英語が下手でごめんなさい。オンラインであなたの答えを待っています。

12
user3330817

Commons compress 1.6以降では、7z形式の操作がサポートされています。それを試してみてください。

参照:

http://commons.Apache.org/proper/commons-compress/index.html

サンプル:

    SevenZFile sevenZFile = new SevenZFile(new File("test-documents.7z"));
    SevenZArchiveEntry entry = sevenZFile.getNextEntry();
    while(entry!=null){
        System.out.println(entry.getName());
        FileOutputStream out = new FileOutputStream(entry.getName());
        byte[] content = new byte[(int) entry.getSize()];
        sevenZFile.read(content, 0, content.length);
        out.write(content);
        out.close();
        entry = sevenZFile.getNextEntry();
    }
    sevenZFile.close();
11
SANN3

7z解凍にはランダムアクセスが必要なため、ストリーム全体を_byte[]_に読み込み、new SevenZFile(new SeekableInMemoryByteChannel(bytes))を使用する必要があります。 (_Integer.MAX_VALUE_バイトより長い場合は、カスタムSeekableByteChannel実装を作成する必要があります。)インスタンスが構築されると、プロセスはSANN3の回答と同じになります。

メモリに収まらない場合および一時ファイルに書き込むことができない場合、ランダムアクセスが必要なため、7Zipは適切な圧縮アルゴリズムではありません。

1
Pr0methean