2013-12-22 4 views
0

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

File[] files = new File("ressources").listFiles(); 
     for (File file : files) { 
      XMLParser parser = new XMLParser(file.getAbsolutePath()); 
      // some work 
     } 

Если я тестирую это, он работает хорошо. Но как только я помещаю содержимое в банку, это происходит не по нескольким причинам. Если я использую этот код, URL-адрес всегда указывает за пределы банки.

структура моего проекта:

src 
    controllers 
    models 
     class that containt traitement 
    views 
ressources 

ответ

1

Смотреть это:

How do I list the files inside a JAR file?

В принципе, вы просто использовать ZipInputStream, чтобы найти список файлов (а .jar такое же, как .zip)

Как только вы знаете имена файлов, вы можете использовать getClass(). getResource (String path), чтобы получить URL-адрес файла.

+0

Сначала я создаю исполняемый банку, содержащий некоторые ресурсы, моя программа работает с IDE, но jar no –

0

Я предполагаю, что это jar находится на вашем пути к классу.

Вы можете перечислить все файлы в каталоге, используя ClassLoader.

Во-первых, вы можете получить список имен файлов, то вы можете получить URL сек от ClassLoader для отдельных файлов:

public static void main(String[] args) throws Exception { 
    final String base = "/path/to/folder/inside/jar"; 
    final List<URL> urls = new LinkedList<>(); 
    try (final Scanner s = new Scanner(MyClass.class.getResourceAsStream(base))) { 
     while (s.hasNext()) { 
      urls.add(MyClass.class.getResource(base + "/" + s.nextLine())); 
     } 
    } 
    System.out.println(urls); 
} 

Вы можете делать все, что вы хотите с URL - либо читать и InputStream в память или скопируйте InputStream в File на свой жесткий диск.

Обратите внимание, что это определенно работает с URLClassLoader, который по умолчанию используется, если вы используете апплет или настраиваемый ClassLoader, тогда этот подход может не сработать.

NB:

У вас есть опечатка - его resources не ressources.

Для вашего проекта вы должны использовать reverse domain name notation, это соглашение.

+0

Я изменяю строку базы в свою папку/ressources, и я получаю это исключение: Исключение в потоке «main» java.lang.NullPointerException \t на java.io.Reader. (Неизвестный источник) \t at java.io.InputStreamReader. (Неизвестный источник) \t на java.util.Scanner. (Неизвестный источник) –

+0

@ELMEKKIAnouar Вы проверили свои опечатки? И я предполагаю, что вы использовали правильный «класс» для ссылки на класс. –

+0

i переименовать мою папку в ресурсы, но я всегда получаю исключение –

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