简体   繁体   中英

zip a folder structure using java

I am trying to zip the following file structure on my machine,

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

The problem here is i cant zip the above file structure using java. I have google and found following code sample but it only zip the files only inside a given folder.

     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();

In the above code the out is a folder and we need to have some files..also folder cannot be empty if so it throws a exception java.util.zip.ZipException or cant contain any sub folders even files inside it (eg:out\\newfolder\\image.jpeg) if so it throws a java.io.FileNotFoundException: out\\newfolder (Access is denied).

In my case im costructig the above file structure by quering the database sometime empty folders along the folder structure can be have.

Can some one please tell me a solution?

Thank You.

What is probably happening is that you're trying to treat every entry as a FileInputStream . However, for a directory, this is not true. Since the path is not to a file, when you try to read it, a FileNotFoundException is thrown. For directories, you still want to create the ZipEntry , but instead of trying to read in any data, just skip it and move on to the next path.

write two methods. The first one takes dirpath, makes a zip stream and calls another method which copies files to the zip stream and calls itself recursively for directories as below:

  1. open an entry in the zip stream for the given directory
  2. list files and dirs in the given directory, loop through them
  3. if an entry is a file, open an entry, copy file content to the entry, close it
  4. if an entry is a directory, call this method. Pass the zip stream
  5. close the entry.

The first method closes the zip stream.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM