だから私はここでコードのブロックをたどりました: 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 ファイルをコピーして戻す必要がありました。このライブラリはそれを回避すると思いましたか?