заархивировать структуру папок с помощью java

Я пытаюсь заархивировать следующую файловую структуру на своей машине,

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

Проблема в том, что я не могу заархивировать вышеуказанную файловую структуру с помощью java. У меня есть Google и я нашел следующий пример кода, но он только заархивирует файлы только внутри данной папки.

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

В приведенном выше коде выход — это папка, и нам нужно иметь некоторые файлы. \newfolder\image.jpeg), если это так, выдается исключение java.io.FileNotFoundException: out\newfolder (доступ запрещен).

В моем случае я создаю вышеуказанную файловую структуру, запрашивая базу данных, иногда могут быть пустые папки в структуре папок.

Может кто-нибудь, пожалуйста, скажите мне решение?

Спасибо.


person Harshana    schedule 07.11.2010    source источник
comment
возможный дубликат java.util.zip - воссоздание структуры каталогов   -  person McDowell    schedule 07.11.2010


Ответы (2)


написать два метода. Первый берет dirpath, создает zip-поток и вызывает другой метод, который копирует файлы в zip-поток и рекурсивно вызывает себя для каталогов, как показано ниже:

  1. открыть запись в zip-потоке для данного каталога
  2. список файлов и каталогов в данном каталоге, цикл по ним
  3. если запись является файлом, открыть запись, скопировать содержимое файла в запись, закрыть ее
  4. если запись является каталогом, вызовите этот метод. Пропустите почтовый поток
  5. закрыть вход.

Первый метод закрывает zip-поток.

person khachik    schedule 07.11.2010
comment
Хачик спасибо за ответ - person Harshana; 07.11.2010

Вероятно, вы пытаетесь рассматривать каждую запись как FileInputStream. Однако для каталога это неверно. Поскольку путь не к файлу, при попытке его чтения выдается FileNotFoundException. Для каталогов вы по-прежнему хотите создать ZipEntry, но вместо того, чтобы пытаться читать какие-либо данные, просто пропустите его и перейдите к следующему пути.

person Nader Shirazie    schedule 07.11.2010