2012-08-13 127 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