zip4j は優れたライブラリです。しかし、スレッドを使用するクラスで使用すると問題が発生します。zip4j メソッドはスレッドを実装するクラスから呼び出され、(常にではありませんが) ファイルが圧縮されないままになり、拡張子が *.zip345 のファイルが残っている場合があります。また、プロセスは net.lingala.zip4j.exception.ZipException: cannot rename modified zip file を返します。
メソッド zip4jProcess は、クラス public メソッドから呼び出されます。クラス名は次のとおりです。SZipInterface.class
はSZipInterface.class
、スレッド クラス ex: ThreadObj.class で初期化され、スレッドごとにインスタンス化されます。静的メソッドは使用されません。
問題の原因は何ですか?どのように修正しますか?zip4j スレッドセーフですか?
方法:
private int zip4jProcess() {
int status = 0;
if (null != getInFiles() && getInFiles().length > 0) {
for (String file : getInFiles()) {
File sourceFile = new File(file);
ZipFile zipFile = null;
ZipParameters zipParams = new ZipParameters();
if (getPassword() != null
&& !getPassword().trim().equalsIgnoreCase("")) {
zipParams.setPassword(getPassword());
zipParams.setEncryptFiles(true);
zipParams
.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
}
zipParams
.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
if (sourceFile.exists()) {
try {
zipFile = new ZipFile(getZipFileName());
if (zipFile.getFile().exists()) {
zipFile.addFile(sourceFile, zipParams);
if (log.isDebugEnabled()) {
log.debug("Adding: " + sourceFile.getName()
+ " to " + zipFile.getFile().getName()
+ " Pass: " + getPassword());
}
} else {
zipFile.createZipFile(sourceFile, zipParams);
if (log.isDebugEnabled()) {
log.debug("Creating: " + sourceFile.getName()
+ " to " + zipFile.getFile().getName()
+ " Pass: " + getPassword());
}
}
} catch (ZipException e) {
log.error(e);
status = 1;
}
}
}
}
return status;
}