Zip4J, исключение нулевого указателя, вызванное внешним файловым потоком?

Я пытаюсь заархивировать кучу файлов из разных мест в одну zip-папку с помощью Zip4J. У меня есть ArrayList файлов из разных папок, и пока я просматриваю список с вызовом «zip.AddFile (file, params)», файлы добавляются нормально до папки, в которую файлы поступают с переключателей. И я получаю следующую ошибку:

 net.lingala.zip4j.exception.ZipException: java.lang.NullPointerException
        at net.lingala.zip4j.zip.ZipEngine.initAddFiles(ZipEngine.java:187)
        at net.lingala.zip4j.zip.ZipEngine.addFiles(ZipEngine.java:85)
        at net.lingala.zip4j.core.ZipFile.addFiles(ZipFile.java:292)
        at net.lingala.zip4j.core.ZipFile.addFile(ZipFile.java:250)
        at tasks.OutputTask.compressFiles(OutputTask.java:627)
        at tasks.OutputTask.uploadHelper(OutputTask.java:550)
        at tasks.OutputTask.uploadHelper(OutputTask.java:593)
        at tasks.OutputTask.uploadHelper(OutputTask.java:593)
        at tasks.OutputTask.uploadHelper(OutputTask.java:593)
        at tasks.OutputTask.uploadHelper(OutputTask.java:593)
        at tasks.OutputTask.upload(OutputTask.java:516)
        at tasks.OutputTask.call(OutputTask.java:279)
        at tasks.OutputTask.call(OutputTask.java:1)
        at javafx.concurrent.Task$TaskCallable.call(Unknown Source)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
    Caused by: java.lang.NullPointerException
        at net.lingala.zip4j.zip.ZipEngine.prepareFileOutputStream(ZipEngine.java:433)
        at net.lingala.zip4j.zip.ZipEngine.removeFilesIfExists(ZipEngine.java:385)
        at net.lingala.zip4j.zip.ZipEngine.initAddFiles(ZipEngine.java:109)
        ... 17 more

Сам код

        ZipFile zip;
        try {
            System.out.println("Creating zip: " + outputName);
            File zipfile;
            if ((zipfile = new File(outputName)).exists()) {
                zipfile.delete();
            }
            zip = new ZipFile(new File(outputName));

            ZipParameters params = new ZipParameters();
            if (encrypt) {
                params.setEncryptFiles(true);
                params.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
                params.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
                params.setPassword(Property.AES_ENCRYPTION_KEY.getValue());

            }
            params.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
            params.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
            for (File file : sourceFiles) {
                if (file.isFile()) {
                    try {
                        zip.addFile(file, params);
                    } catch (ZipException e) {
                        e.printStackTrace();
                    }
                }
          }

Так, например, вот список файлов

files = {C: / Folder1 / img1, C / Folder1 / txtFile, C: / Folder1 / jar, C: / Folder2 / img2}

код будет выполняться нормально, пока не попадет в "C: / Folder2 / img2", где он вернет указанную выше ошибку. я пытался

params.setSourceExternalStream(true);

что дает другую ошибку, говоря, что нет имени для внешнего исходного файла. Любая помощь будет принята с благодарностью. заранее спасибо


person nsmith95    schedule 07.05.2016    source источник


Ответы (1)


Попробуйте добавить params.setFileNameInZip (filename); params.setSourceExternalStream (истина);

person JoeH-Java    schedule 11.09.2017