2

だから私はここでコードのブロックをたどりました: http://commons.apache.org/proper/commons-compress/examples.html、単純に ZipArchiveEntry を作成してからデータを挿入すると言われています。以下の私のコードでわかるように。

    public void insertFile(File apkFile, File insert, String method)
    throws AndrolibException {
        ZipArchiveOutputStream out = null;
        ZipArchiveEntry entry;

        try {
            byte[] data = Files.toByteArray(insert);
            out = new ZipArchiveOutputStream(new FileOutputStream(apkFile, true));
            out.setMethod(Integer.parseInt(method));
            CRC32 crc = new CRC32();
            crc.update(data);
            entry = new ZipArchiveEntry(insert.getName());
            entry.setSize(data.length);
            entry.setTime(insert.lastModified());
            entry.setCrc(crc.getValue());
            out.putArchiveEntry(entry);
            out.write(data);
            out.closeArchiveEntry();
            out.close();
        } catch (FileNotFoundException ex) {
            throw new AndrolibException(ex);
        } catch (IOException ex) {
            throw new AndrolibException(ex);
        }
}

基本的に、そのファイルの圧縮方法を指示する別のパラメーターを使用して、「挿入」ファイルを取得するファイル (apkFile) が渡されます。このコード ブロックを実行するとエラーは発生しませんが、ZIP ファイルには「新しい」ファイルしか含まれていません。以前のファイルをすべて削除してから、新しいファイルを挿入します。

commons-compress の前は、Zip 全体を一時ファイルにコピーし、変更を加えてから、最終化された Zip ファイルをコピーして戻す必要がありました。このライブラリはそれを回避すると思いましたか?

4

2 に答える 2

0

それらを使い終わったら(つまり)、できればfinallyブロックで、常にストリーミングしたいと考えています。close()out.close()

于 2013-05-02T14:54:03.367 に答える
0

別の方法として、NIO.2 ファイル API (ライブラリはオープン ソースです) を使用して、ファイルとディレクトリを Zip ファイルにコピーするユーティリティ メソッドをいくつか作成しました。

メイヴン:

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

チュートリアル:

http://softsmithy.sourceforge.net/lib/current/docs/tutorial/nio-file/index.html#AddZipResourceSample

API: CopyFileVisitor.copy

于 2013-05-02T14:57:56.317 に答える