2016-05-07 29 views
2

我想使用Zip4J將一堆來自不同位置的文件壓縮到一個zip文件夾中。我有一個來自不同文件夾的文件的ArrayList,並且當我循環調用「zip.AddFile(file,params)」列表時,文件將被正確添加,直到文件從交換機中傳出爲止。我收到以下錯誤,Zip4J,空指針由外部文件流引起的異常?

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(); 
        } 
       } 
      } 

因此,舉例來說,這裏是一個文件

文件= {C名單:/文件夾/ IMG1,C/Folder1/txtFile,C:/ Folder1/jar,C:/ Folder2/img2}

代碼將正常執行,直到它碰到「C:/ Folder2/img2」,它將返回上述錯誤。我試過

params.setSourceExternalStream(true); 

它提供了一個不同的錯誤,說外部源文件沒有名稱。任何幫助將不勝感激。在此先感謝

回答

0

嘗試添加 params.setFileNameInZip(filename); params.setSourceExternalStream(true);