2013-10-24 3 views
5

Я запутался getResourceAsStream();Где находится файл getResourceAsStream (файл)?

Мой пакет структура выглядит следующим образом:

\src 
|__ net.floodlightcontroller // invoked getResourceAsStream() here 
|__ ... 
|__ resources 
    |__ floodlightdefault.properties //target 
    |__ ... 

И я хочу, чтобы читать из floodlightdefault.properties. Вот мой код, лежащий в net.floodlightcontroller упаковке:

package net.floodlightcontroller.core.module; 
// ... 
InputStream is = this.getClass().getClassLoader() 
       .getResourceAsStream("floodlightdefault.properties"); 

Но это не удалось, получив is == null. Поэтому мне интересно, как именно getResourceAsStream(file) ищет file. Я имею в виду, он работает через определенные PATH s или в определенном порядке?

Если да, то как настроить места, которые ищет getResourceAsStream()?

Thx!

+0

Вы добавили каталог ресурсов в classpath при запуске вашего кода? Вообще говоря, поведение getResourceAsStream зависит от реализации ClassLoader. –

+0

Вообще говоря, это также будет зависеть от того, что это означает. – Radiodef

+0

Чтобы исправить вашу нулевую проблему, сначала я вижу две вещи. Во-первых, похоже, вам просто нужно изменить свой каталог на '' resources/floodlightdefault.properties''. Во-вторых, метод может искать ресурс внутри вашего каталога сборки, а структура каталогов, которую вы указали, является исходной папкой проекта IDE. Хотя, конечно, если вы добавили ресурсы в проект, среда IDE должна автоматически копировать файлы в каталог сборки. В быстрых тестах с Netbeans мои ресурсы появляются только в null, если я удаляю их из папки _both_ build и src. – Radiodef

ответ

7

Когда вы вызываете this.getClass().getClassLoader().getResourceAsStream(File), Java ищет файл в том же каталоге, что и класс, обозначенный this. Так что, если ваша структура файла:

\src 
|__ net.floodlightcontroller.core.module 
    |__ Foo.java 
|__ ... 
|__ resources 
    |__ floodlightdefault.properties //target 
    |__ ... 

Тогда вы хотите позвонить:

InputStream is = Foo.class.getClassLoader() 
      .getResourceAsStream("..\..\..\resources\floodlightdefault.properties"); 

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

\src 
|__ net.floodlightcontroller.core.module 
    |__ Foo.java 
    |__ floodlightdefault.properties //target 
    |__ ... 

и просто вызов звоните:

InputStream is = Foo.class.getClassLoader() 
      .getResourceAsStream("floodlightdefault.properties"); 
+0

@Jones Спасибо, и я добавил 'resources' в путь класса, он также работает. – qweruiop

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