2015-02-13 3 views
1

Я проект структурирован, как показано ниже:
как список всех файлов в каталоге - развертывание

Myproject 
|--package1 
| |--class1 
|--package2 
| |--class2 
|--rsc 
| |--images 
|  |--image1 
     |--image2 

Моя проблема заключается, чтобы получить все файлы (images1 & изображений2) в каталоге изображений после того, как я экспортировал этот проект как .jar.

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

this.getClass().getClassLoader().getResource(path); 

Но с помощью этого метода я могу просто получить ресурсы и не все файлы в этой папке.

Это то, что я пытался сделать:

File[] files = new File(this.getClass().getClassLoader().getResource("images").getFile()).listFiles(); 

Он работает в Eclipse, но он не работает, когда я экспортировать проект как .jar.

Есть ли какие-либо решения?

ответ

1

Можно перебирать содержимое папки внутри файла jar. Это, однако, очень больно.

Посмотрите на класс JarFile. Вы можете получить все записи Jar с помощью метода entries(), а затем отфильтровать их, только просмотрев записи, начинающиеся с "images/".

Что-то вроде этого:

// this is a lengthy work around to figure out the path of the jar file that 
// this application was started from 
File pathToJar = new File(Util.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()); 

JarFile jarFile = new JarFile(pathToJar); 
java.util.Enumeration enumEntries = jarFile.entries(); 
while (enumEntries.hasMoreElements()) { 
    java.util.jar.JarEntry file = (java.util.jar.JarEntry) enumEntries.nextElement(); 

    if(!file.getName().contains("images/")) { 
     continue; 
    } 

    // do something with that JarEntry 

} 

Это не будет работать во время запуска приложения в Eclipse, хотя (так как нет JarFile там для сканирования).
Вам нужно сделать различие в своем коде, где вы или итерации по каталогу обычным способом или используете этот способ с файлом Jar в зависимости от того, как вы запустили приложение.

Если это слишком уродливое и/или слишком много работы, вы, вероятно, также должны подумать о том, чтобы просто поместить эту папку ресурсов за пределы банки в фактическую файловую систему.
Тогда вы можете просто получить доступ к нему, как и при любом другом каталоге:

File[] files = new File("./rsc/images/").listFiles(); 

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

+0

Этот метод довольно боль. Не могу ли я, например, поместить папку rsc в тот же каталог .jar, а затем получить к ней доступ? – anass

+0

Это всегда возможно. Я также отредактировал свой ответ, чтобы включить это. – mhlz

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