Как создать / сжать всю структуру каталогов с помощью API java.util.jar? - PullRequest
1 голос
/ 11 января 2012

Я использую следующий код, чтобы попробовать упаковать каталог со всеми его подкаталогами и файлами в один jar-файл.

private void writeFile(JarOutputStream jos, File f) throws IOException {
  byte buffer[] = new byte[BUFFER_SIZE];

  if (f == null || !f.exists())
      return; //

  JarEntry jarAdd = new JarEntry(f.getName());
  jarAdd.setTime(f.lastModified());
  jos.putNextEntry(jarAdd);

  if(f.isDirectory()){
      File[] files = f.listFiles();
      for(int i = 0; i < files.length ; i++){
          writeFile(jos,files[i]);
      }
  }
  else{
      FileInputStream in = new FileInputStream(f);
      while (true) {
        int nRead = in.read(buffer, 0, buffer.length);
        if (nRead <= 0)
          break;
        jos.write(buffer, 0, nRead);
      }
      in.close();
  }
}

Однако FileInputStream не работает с каталогами, поэтому я предполагаю, что добавление JarEntry будетДостаточно.

Поскольку у меня есть другая проблема, я не могу проверить, верно ли это предположение.Эта проблема заключается в том, что многие сделанные записи повторяются.

При попытке добавить структуру ...

activation
/--activation
   /-- somefile.txt

... этот код завершается ошибкой, так как активация добавляется в банку дважды.Поскольку это разные каталоги, вложенные друг в друга, я не понимаю, почему это не должно работать каким-либо образом.

Кажется, что добавление записи с помощью file.getName () получит идентификаторы входа, которые не различаюткаталоги, в которых находятся эти файлы. Однако, когда я использую, например,

file.getAbsolutePath() 

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

Кто-нибудь может порекомендовать способ правильной упаковки структур каталогов в jar-файл?

Ответы [ 2 ]

4 голосов
/ 11 января 2012

Обратите внимание, что JarEntry, представляющий каталог (папку), должен заканчиваться косой чертой ("/"), чтобы рассматриваться как таковой;в противном случае он будет считаться простым файлом.

JarEntry dir = new JarEntry("activation/");
3 голосов
/ 11 января 2012

Имя записи должно быть относительным путем от корня вашего дерева.Если у вас есть

a
-- b
------c.txt

, записи должны быть a/, a/b/ и a/b/c.txt.Добавьте префиксный аргумент к вашему рекурсивному методу (который изначально является пустой строкой), и каждый раз, когда встречается каталог, вызывайте метод с текущим префиксом + добавленным именем каталога + /.И всегда добавляйте префикс к имени файла, чтобы составить имя записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...