2009-04-14 5 views
15

Я знаю, что мы можем сделать что-то вроде этого:Как пройти через ресурсы класса Java?

Class.class.getResourceAsStream("/com/youcompany/yourapp/module/someresource.conf") 

читать файлы, которые упакованы в наш файл фляги.

У меня много проблем в googled, и я уверен, что не использую правильные условия; что я хочу сделать, это список доступных ресурсов, что-то вроде этого:

Class.class.listResources("/com/yourcompany/yourapp") 

Это должно возвращать список ресурсов, которые находятся внутри пакета com.yourcompany.yourapp.*

возможно ли это? Любые идеи о том, как это сделать, если это невозможно сделать так же легко, как я показал?

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

+0

Есть что-то вроде ServiceLoader? http://stackoverflow.com/questions/251336 То есть вместо того, чтобы перечислять «каталог» в пути к классам во время выполнения, вы предоставляете список ресурсов явно во время компиляции и сохраняете его на пути к классам в известном месте , – erickson

ответ

9

Для ресурсов в файле JAR, что-то вроде этого произведения:

URL url = MyClass.class.getResource("MyClass.class"); 
String scheme = url.getProtocol(); 
if (!"jar".equals(scheme)) 
    throw new IllegalArgumentException("Unsupported scheme: " + scheme); 
JarURLConnection con = (JarURLConnection) url.openConnection(); 
JarFile archive = con.getJarFile(); 
/* Search for the entries you care about. */ 
Enumeration<JarEntry> entries = archive.entries(); 
while (entries.hasMoreElements()) { 
    JarEntry entry = entries.nextElement(); 
    if (entry.getName().startsWith("com/y/app/")) { 
    ... 
    } 
} 

Вы можете сделать то же самое с ресурсами «разобранном» в файловой системе , или во многих других репозиториях, но это не так просто. Вам нужен специальный код для каждой схемы URL, которую вы хотите поддержать.

+0

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

+0

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

+0

Хмм, Предположим, вы находитесь в реализации java vm appengine. Это не позволит вам открыть файл. Это было более или менее. Поэтому я думаю, что это правильный ответ, но то, что я хотел сделать, невозможно. У него могут быть проблемы с безопасностью, чтобы не допустить этого :( С уважением erickson –

0

Я обычно использую

getClass().getClassLoader().getResourceAsStream(...) 

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

+0

Можете ли вы показать, пожалуйста, ссылку, которая указывает, что вы говорите как факт? –

2

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

4

В целом не удается получить список ресурсов, подобных этому. Некоторые загрузчики классов могут даже не быть в состоянии для поддержки этого - представьте себе загрузчик классов, который может извлекать отдельные файлы с веб-сервера, но веб-сервер не должен поддерживать перечисление содержимого каталога. Для файла jar вы можете загружать содержимое файла jar явно, конечно.

(This question похож, кстати.)

+0

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

+0

@David: Я привел пример того, почему это не всегда возможно - ситуация, когда единственная доступ к вам в базовом хранилище (в Интернете) - это «выборка этого файла». –

+0

Прошу прощения, теперь я получил его. Это был мой плохой английский и, вероятно, отсутствие внимания. Теперь я понимаю вас. Спасибо –

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