2012-01-11 2 views
1

Im используя следующий код, чтобы попробовать пакет, каталог со всеми его подкаталогами и файлами в один jar-файл.Как jar/zip весь каталог Структура с java.util.jar api?

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?

+0

Взгляните на класс, который я сделал: http://all-inhonmodman.svn.sourceforge.net/viewvc/all-inhonmodman/ModManager/src/modmanager/utility/ZIP.java?revision=292&content-type= text% 2Fplain У этого есть все методы, в которых Вы нуждаетесь. – SHiRKiT

ответ

4

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

JarEntry dir = new JarEntry("activation/"); 
3

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

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

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

+0

Оба ответа помогли мне сделать эту работу, но я могу ее принять. Так что спасибо вам обоим! – elfwyn

Смежные вопросы