使用java压缩文件夹结构

时间:2010-11-07 07:25:30

标签: java zip fileinputstream

我正在尝试在我的机器上压缩以下文件结构,

parent/
parent/test1
parent/test1/image1.jpeg
parent/test2

这里的问题是我无法使用java压缩上述文件结构。我有谷歌,发现以下代码示例,但它只在给定文件夹中压缩文件。

     File inFolder=new File("out");
     File outFolder=new File("Out.zip");
     ZipOutputStream out = new ZipOutputStream(new 
BufferedOutputStream(new FileOutputStream(outFolder)));
     BufferedInputStream in = null;
     byte[] data    = new byte[1000];
     String files[] = inFolder.list();
     for (int i=0; i<files.length; i++)
      {
      in = new BufferedInputStream(new FileInputStream
(inFolder.getPath() + "/" + files[i]), 1000);                  
out.putNextEntry(new ZipEntry(files[i])); 
      int count;
      while((count = in.read(data,0,1000)) != -1)
      {
           out.write(data, 0, count);
          }
      out.closeEntry();
      }
      out.flush();
      out.close();

在上面的代码中,out是一个文件夹,我们需要有一些文件。如果是这样,文件夹也不能为空它抛出异常java.util.zip.ZipException或者不能包含任何子文件夹甚至文件里面的文件(例如:out \ newfolder \ image.jpeg)如果是这样,它会抛出一个java.io.FileNotFoundException:out \ newfolder(访问被拒绝)。

在我的情况下,通过查询数据库,有时可以使用文件夹结构中的空文件夹来构建上述文件结构。

有人可以告诉我一个解决方案吗?

谢谢。

2 个答案:

答案 0 :(得分:3)

您可能正在尝试将每个条目视为FileInputStream。但是,对于目录,这不是真的。由于路径不是文件,因此当您尝试读取它时,会抛出FileNotFoundException。对于目录,您仍然希望创建ZipEntry,但不要尝试读取任何数据,只需跳过它并继续前进到下一个路径。

答案 1 :(得分:2)

写两种方法。第一个采用dirpath,创建一个zip流并调用另一个方法将文件复制到zip流,并递归调用自己的目录,如下所示:

  1. 在给定目录的流中打开一个条目
  2. 列出给定目录中的文件和目录,循环浏览
  3. 如果条目是文件,则打开条目,将文件内容复制到条目,关闭它
  4. 如果条目是目录,请调用此方法。传递zip流
  5. 关闭条目。
  6. 第一种方法关闭了zip流。

相关问题