所以我在这里遵循了代码块: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),它将采用“插入”文件,另一个参数指示该文件的压缩方法。运行此代码块会导致0错误,但ZIP文件中只包含该“新”文件。它会删除所有以前的文件,然后插入新文件。
在commons-compress之前,我不得不将整个Zip复制到临时文件,进行更改,然后将最终的Zip文件复制回来。我认为这个图书馆可以解决这个问题吗?
答案 0 :(得分:0)
总是想要close()
流完成后(即out.close()
),最好是在finally块中。
答案 1 :(得分:0)
作为替代方案:我已经编写了一些实用程序方法,使用NIO.2文件API将文件和目录复制到Zip文件(该库是开源的):
的Maven:
<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