[英]Multi Thread zip4j
zip4j 是一個很棒的庫。 但是在使用線程的類中使用它時遇到了問題。 zip4j 方法是從實現線程的類調用的,有時(並非總是)它會使文件解壓縮,有時會留下擴展名為 *.zip345 的文件。 該過程還返回 net.lingala.zip4j.exception.ZipException: cannot rename modified zip file。
方法 zip4jProcess 是從類公共方法調用的。 類名是: SZipInterface.class
SZipInterface.class
在線程類中初始化,例如: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 文件(可能在 zipFile.addFile(...))時,您可能會有剩余文件或未壓縮的文件。
因此,請嘗試以不同方式處理 addFile 並考慮並發性。
他們的支持論壇說這很棘手,目前不支持 - 請參閱鏈接以了解這樣做的限制。
這可能很難實現,如果不是不可能實現的話,尤其是在使用加密或壓縮文件時(而不僅僅是使用 store 方法,它只是將源文件復制到 zip 而不進行任何壓縮)。 當前正在壓縮/解壓縮的文件塊取決於前一個塊。 因此,如果多個線程要讀取或寫入,則這些線程不能同時執行此過程,而必須等到塊 n-1(如果 n 是當前塊)被讀取/寫入。 因此,它與在同一線程中運行進程一樣好。
將不同線程中的不同文件寫入 zip 文件(每個線程處理 zip 中的唯一文件)也可能很棘手。 例如:AES 加密要求 zip 中的每個文件都有一個唯一編號(作為鹽計算的一部分)。 另一個例子:如果正在創建一個 zip 文件並添加多個文件(帶壓縮),那么將開始將第二個文件寫入 zip 的第二個線程應該確切知道從 zip 文件中的哪個位置開始寫入,並且在第一個線程完成寫入之前無法確定。
一些壓縮算法,如 LZMA/LZMA2,支持多線程。 不幸的是,目前 Zip4j 不支持這些壓縮方法。
他們回復的全文(以防帖子被刪除)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.