簡體   English   中英

多線程 zip4j

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM