zip структура папок с использованием Java - PullRequest
1 голос
/ 07 ноября 2010

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

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

В приведенном выше коде out - это папка, и нам нужны некоторые файлы. Также папка не можетбыть пустым, если это так, он генерирует исключение java.util.zip.ZipException или не может содержать любые подпапки, даже файлы внутри него (например, out \ newfolder \ image.jpeg), если это так, он генерирует исключение java.io.FileNotFoundException: out \ newfolder(Доступ запрещен).

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

Может кто-нибудь сказать мне решение?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 07 ноября 2010

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

2 голосов
/ 07 ноября 2010

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

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

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

...