2012-08-13 123 views
0

我從ZIP檔案使用此代碼(省略所有的catch語句和其他初始化語句)提取文件中提取的ZIP檔案文件:錯誤在Java中

zipInputStream = new ZipInputStream(new FileInputStream(file)); 
zipFile = new ZipFile(file); 
for (Enumeration<?> em = zipFile.entries(); em.hasMoreElements();) { 
    String extractedFileName = em.nextElement().toString(); 
    ZipEntry outerZipEntry = zipInputStream.getNextEntry(); 
    if (outerZipEntry.getName().contains(searchString)) { 
     extractedFile = new File(outputDir + outerZipEntry.getName()); 
     out = new FileOutputStream(outputDir + extractedFileName); 
     byte[] buf = new byte[1024]; 
     int len; 
     while ((len = zipInputStream.read(buf)) > 0) { 
      out.write(buf, 0, len); 
     } 
     break; 
    } 
} 

此代碼工作正常時,在/archive.zip/file_i_need.txt中提取文件。

但是,當我試圖從/archive.zip/folder1/file_i_need.txt中提取文件時,我嘗試使用readLine()讀取文件時收到異常java.lang.NullPointerException:

String line = null ; 
BufferedReader input = new BufferedReader(newFileReader(extractedFile)) ; 
while((line = input.readLine()) != null) { 
    ... 
} 

我已經測試了這兩種情況下,它似乎像當文件夾裏面,因爲extractedFileName是「文件夾/ file_i_need.txt」相比,只是「file_i_need.txt」這個代碼將無法正常工作。

任何建議,你可以推薦?

謝謝!

+1

發佈完整堆棧跟蹤。 – Wug 2012-08-13 19:22:20

+0

錯誤實際上不會在代碼中發生,它發生在我嘗試從文件讀取時發生。我正在更新帖子以獲取更多信息。 – joshualan 2012-08-13 19:24:18

+0

Dup http://stackoverflow.com/questions/1399126/java-util-zip-recreating-directory-structure – mazaneicha 2012-08-13 19:24:47

回答

1
extractedFile = new File(outputDir + outerZipEntry.getName()); 

的問題是你沒有考慮到的條目名稱可能包含路徑元素,它沒有創建,您只需嘗試將文件寫入的。爲什麼這不會產生錯誤,我不確定。

你是在Windows上寫這些文件?這將創建文件系統,它是在一定程度上可能無效像folder1/file_i_need.txt文件:P

嘗試從ZipEntry

String name = outerZipEntry.getName(); 
name = name.substring(name.lastIndexOf("/") + 1); 

顯然解壓的文件名,請檢查該名稱實際上包含了「/ 「第一;)

UPDATE

,而我在這,這看起來錯

extractedFile = new File(outputDir + outerZipEntry.getName()); 
out = new FileOutputStream(outputDir + extractedFileName); 

基本上你說outputDir + outerZipEntry.getName() + (outputDir + outerZipEntry.getName())

UPDATE

我測試了在Windows和我得到一個FileNotFoundException當我嘗試寫文件的路徑不存在

我也在我的MaC上測試它,我得到一個FileNotFoundException

我不知道你的錯誤處理在做什麼,但它做錯了。

+0

謝謝,我實際上認爲我寫入文件的方式是錯誤的。我將代碼寫入一個靜態文件(用於臨時修復),它似乎可行! – joshualan 2012-08-13 21:31:18

0

你迭代的拉鍊條目兩種不同的方式:

迭代1:

for (Enumeration<?> em = zipFile.entries(); em.hasMoreElements();) { 

迭代2:

ZipEntry outerZipEntry = zipInputStream.getNextEntry(); 

只是做一個或另一個。請使用ZipFile API或ZipInputStream API。我強烈懷疑這是NullPointerException的來源。

+0

我編輯的代碼只使用迭代2迭代,但仍然是相同的錯誤,所以我猜這兩個不同的迭代不是它。 – joshualan 2012-08-13 19:33:41

+0

然後我會與其他答案一起去。解壓縮文件的父目錄不存在,並且您的錯誤處理代碼將其變成NullPointerException。上面代碼中的堆棧跟蹤和行號指示肯定會有所幫助。 – 2012-08-13 21:25:02

1

我認爲你的問題是你無法打開out = new FileOutputStream(outputDir + extractedFileName);行的FileOutputStream。你不能打開一個流,因爲如果extractedFileNamefolder1/file_i_need.txt和outputDir是,例如,C:/OutputDir那麼你試圖打開一個流C:/OutputDirfolder1/file_i_need.txt。這樣的目錄不存在,out變爲null。 我在評論中提到的帖子確實有一個解壓縮操作,您可以在zip文件中看到特殊的目錄條目處理。

+0

是的,我認爲這也是問題,我是Java新手,所以我認爲我的問題實際上是我寫入文件的方式,而不是文件的路徑。 O_O – joshualan 2012-08-13 21:30:09