zip4j是一個偉大的圖書館。但是在使用線程的類中使用它時遇到問題。 zip4j方法是從實現線程的類中調用的,有時(並非總是)它會使文件解壓縮,並且有時會存在擴展名爲* .zip345的左文件。此外,該過程返回net.lingala.zip4j.exception.ZipException:無法重命名修改後的zip文件。多線程zip4j
從類public方法調用zip4jProcess方法。類名是: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;
}
是否有一個原因,你想出了這樣的結構,而不是使用單個線程的壓縮?請注意,您可以編寫多線程代碼,其中每個線程將打包自己的zip文件。然而,在你的代碼中,你的共享資源似乎來自'getInFiles()',你的代碼不是線程安全的。 – Kayaman
使用多線程的原因是爲了獲得更快的結果來生成多個文件。我可以在方法上使用同步關鍵字嗎? –
你創建了多少個zip文件?正如你所看到的,多線程不是一個神奇的「讓事情變得更快」的詭計。 「同步」也不是神奇的。我建議使用單線程並學習如何正確實現多線程程序(以及它的意義,因爲在你的程序中它是沒有意義的)。 – Kayaman