Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中提取zip存档中的文件时出错_Java_Zip - Fatal编程技术网

在Java中提取zip存档中的文件时出错

在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存档中提取文件(省略所有catch语句和其他初始化语句):

我在这两种情况下都进行了测试,当文件位于文件夹中时,这段代码似乎不起作用,因为提取的文件名是“folder/file\u I\u need.txt”,而不是“file\u I\u need.txt”

你有什么建议可以推荐吗


谢谢

您正在以两种不同的方式迭代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);