在Java中提取zip存档中的文件时出错
我使用以下代码从zip存档中提取文件(省略所有catch语句和其他初始化语句): 我在这两种情况下都进行了测试,当文件位于文件夹中时,这段代码似乎不起作用,因为提取的文件名是“folder/file\u I\u need.txt”,而不是“file\u I\u need.txt” 你有什么建议可以推荐吗在Java中提取zip存档中的文件时出错,java,zip,Java,Zip,我使用以下代码从zip存档中提取文件(省略所有catch语句和其他初始化语句): 我在这两种情况下都进行了测试,当文件位于文件夹中时,这段代码似乎不起作用,因为提取的文件名是“folder/file\u I\u need.txt”,而不是“file\u I\u need.txt” 你有什么建议可以推荐吗 谢谢 您正在以两种不同的方式迭代zip条目: 迭代1: for (Enumeration<?> em = zipFile.entries(); em.hasMoreElements(
谢谢 您正在以两种不同的方式迭代zip条目: 迭代1:
for (Enumeration<?> em = zipFile.entries(); em.hasMoreElements();) {
做一个或另一个。使用
ZipFile
API或ZipInputStream
API。我强烈怀疑这就是NullPointerException
的来源。我认为您的问题在于无法在第行out=newfileoutputstream(outputDir+extractedFileName)上打开FileOutputStream代码>。无法打开流,因为如果extractedFileName
是folder1/file\u i\u need.txt
并且outputDir是,例如,C:/outputDir
,那么您正试图在C:/OutputDirfolder1/file\u i\u need.txt上打开流。这样的目录不存在,out变为null。
我在评论中提到的帖子确实有一个解压操作,你可以看到zip文件中对目录项的特殊处理
extractedFile = new File(outputDir + outerZipEntry.getName());
问题是您没有考虑条目名称可能包含path元素,而您没有创建该元素,您只是尝试写入文件。我不确定为什么这不会产生错误
你在Windows上写这些文件吗??这将在文件系统上创建一个类似于folder1/file_i_need.txt
的文件,该文件在某种程度上可能无效:P
尝试从ZipEntry
String name = outerZipEntry.getName();
name = name.substring(name.lastIndexOf("/") + 1);
显然,请检查名称是否确实包含“/”first;)
更新
当我这么做的时候,这看起来是错的
extractedFile = new File(outputDir + outerZipEntry.getName());
out = new FileOutputStream(outputDir + extractedFileName);
基本上你说的是outputDir+outerZipEntry.getName()+(outputDir+outerZipEntry.getName())
更新
我在Windows上对此进行了测试,当我尝试将文件写入一个不存在的路径时,得到了一个FileNotFoundException
我还在我的MaC电脑上测试了它,得到了一个FileNotFoundException
我不知道您的错误处理在做什么,但它做错了。错误实际上并不发生在代码中,而是在我尝试读取文件时发生的。我正在更新帖子以获取更多信息。@joshualan的Dup如果你看到一个NullPointerException
,我们需要知道哪一行触发了它。如果它不在上面列出的代码中,那么它将被抛出到哪里?我在它抛出错误的地方添加了代码,它位于while循环中的条件语句中。@mazaneicha我想它可能不是重复的,当我试图从zip存档中提取一个zip存档时,它正在尝试创建一个zip存档。如果我错了,这个问题是如何解决我的问题的?我编辑了代码,只使用迭代2进行迭代,但仍然是相同的错误,所以我猜两个不同的迭代不是这样。然后我会使用其他答案。解压文件的父目录不存在,错误处理代码会将其转换为NullPointerException。上面代码中的堆栈跟踪和行号指示肯定会有帮助。是的,我认为这也是问题所在,我是Java新手,所以我认为我的问题实际上是写入文件的方式,而不是文件的路径。Ohu OThanks,我实际上认为我写入文件的方式是错误的。我让代码写入一个静态文件(用于临时修复),它似乎可以工作!
extractedFile = new File(outputDir + outerZipEntry.getName());
String name = outerZipEntry.getName();
name = name.substring(name.lastIndexOf("/") + 1);
extractedFile = new File(outputDir + outerZipEntry.getName());
out = new FileOutputStream(outputDir + extractedFileName);