尝试使用java.util.zip.ZipFile解压缩存档时出现FileNotFoundException

时间:2011-11-04 05:30:12

标签: java unzip filenotfoundexception

我有一个愚蠢的问题,我无法弄明白。谁能帮我? 我的代码如下:

String zipname = "C:/1100.zip";
    String output = "C:/1100";
    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;
    try {
        ZipFile zipFile = new ZipFile(zipname);
        Enumeration<?> enumeration = zipFile.entries();
        while (enumeration.hasMoreElements()) {
            ZipEntry zipEntry = (ZipEntry) enumeration.nextElement();
            System.out.println("Unzipping: " + zipEntry.getName());
            bis = new BufferedInputStream(zipFile.getInputStream(zipEntry));
            int size;
            byte[] buffer = new byte[2048];

它不会创建文件夹,但调试会显示正在生成的所有内容。 为了创建一个文件夹,我使用了代码

  

if(!output.exists()){ output.mkdir();} // here i get an error saying filenotfoundexception

            bos = new BufferedOutputStream(new FileOutputStream(new File(outPut)));
            while ((size = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, size);
            }
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        bos.flush();
        bos.close();
        bis.close();
    }

我的zip文件包含图片:a.jpg b.jpg ...在同一层次结构中,我有abc.xml。 我需要提取zip文件中的内容。 这里有任何帮助。

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题:outPut声明在哪里? output不是文件而是字符串,因此exists()mkdir()不存在。首先声明output喜欢:

File output = new File("C:/1100");

此外,未声明outPut(大P)。它类似output + File.seprator + zipEntry.getName()

 bos = new BufferedOutputStream(new FileOutputStream(output + File.seprator + zipEntry.getName()));

请注意,您不需要将文件传递给FileOutputStream,因为构造函数显示在the documentation中。

此时,如果Zip文件不包含目录,则代码应该有效。但是,在打开输出流时,如果zipEntry.getName()有一个目录组件(例如somedir/filename.txt),打开该流将产生FileNotFoundException,作为您尝试的文件的父目录创造不存在。如果您希望能够处理此类zip文件,您可以在How to unzip files recursively in Java?

中找到答案