-1

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;
}
4

1 に答える 1