2014-01-21 6 views
2

Сейчас я вручную записываю имена файлов песен в массив String, а затем отправляю строки InputStream is = this.getClass().getResourceAsStream(filename);, чтобы воспроизвести эту песню.Получить все имена файлов из папки ресурсов в проекте java

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

Все мои песни находятся в папке resources:

enter image description here

Есть ли метод Java или что-то, чтобы захватить эти имена?

Файлы должны работать при экспорте .jar.

Я думал, что могу использовать что-то вроде этого?

InputStream is = this.getClass().getClassLoader().getResourceAsStream("resources/");

Есть ли listFiles() или что-то для этого?

Thanks

ответ

2

Нет, потому что путь к классам является динамическим в Java. Любой дополнительный Jar может способствовать пакету, загрузчик классов может быть столь же динамичным, как и воображаемый, и даже динамически создавать классы или ресурсы по требованию.

Если у вас есть определенный JAR-файл, и вы знаете путь в этом JAR-файле, вы можете просто обработать этот файл как архив и получить доступ к нему через java.util.jar.JarFile, который позволяет вам перечислить все записи в файле.

JarFile jar = new JarFile("res.jar"); 
Enumeration<JarEntry> entries = jar.entries(); 
while (entries.hasMoreElements()) { 
    JarEntry entry = entries.nextElement(); 
    System.out.println(entry.getName()); 
} 

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

+0

Так что я могу читать одно имя файла одновременно, но нет t получить все имена файлов в массив и отправить их, как я хочу 'getResourceAsStream'? – Growler

+0

Я не знаю, правильно ли я вас понимаю. Конечно, вы можете перебирать записи и строить массив (или лучшую структуру данных) идентификаторов ресурсов.'getResourceAsStream' принимает только одиночные идентификаторы. –

+0

Вот что я хочу сделать. Я хочу получить все имена песен в виде строк и поместить их в свой собственный массив строк. затем загрузите их, как я хочу, в качестве отдельных путей в 'getResourceAsStream'. Я просто не знаю, как получить все имена песен из папки «resources». – Growler

0

Вы можете попробовать что-то вроде этого

Enumeration<URL> e = ClassLoader.getSystemResources("org/apache/log4j"); 
while (e.hasMoreElements()) { 
    URL u = e.nextElement(); 
    String file = u.getFile(); 
... 

file:/D:/.repository/log4j/log4j/1.2.14/log4j-1.2.14.jar!/org/apache/log4j

экстракт баночки путь здесь и использовать JarFile класс знать содержание орг/Apache/log4j.

Если распакован, вы получите прямой путь и использовать File.listFIles

1

Используйте-исследователь классов-1.0, т.е. com.google.classpath.ClassPathFactory

<dependency> 
     <groupId>com.google.classpath-explorer</groupId> 
     <artifactId>classpath-explorer</artifactId> 
     <version>1.0</version> 
</dependency> 

Пример:

ClassPathFactory factory = new ClassPathFactory(); 
String[] allFiles = factory.createFromJVM().findResources(resourceName, new RegExpResourceFilter(".*", ".*\\.mp3")); 

//.mp3 или .txt или .json и т. Д.

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