Как я должен использовать getResource () в Java? - PullRequest
4 голосов
/ 19 июня 2011

Этот вопрос задают во многих местах, с множеством небольших вариаций.(Например, Java - getClassLoader (). GetResource () сводит меня с ума среди других.) Я все еще не могу заставить его работать.
Вот фрагмент кода:

        String clipName = "Chook.wav";
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        // URL url = classLoader.getResource(clipName);
        URL url = new URL("file:///Users/chap/Documents/workspace/the1620/bin/ibm1620/" + clipName);
        ais = AudioSystem.getAudioInputStream(url);

Это работает - обратите внимание, что я жестко запрограммировал путь к каталогу, содержащему файл клипа, который равен , а равен в том же каталоге, что и мой.class файл.Увы, закомментированный код просто возвращает нулевое значение для URL.

Большинство других сообщений, похоже, имеют дело с getResourceAsStream ().Я думаю, что я должен использовать getResource (). что имеет значение?

Просто не может быть таким сложным.Любые подсказки?

Ответы [ 2 ]

4 голосов
/ 19 июня 2011

Методы getResource и getResourceAsStream предназначены для доступа к ресурсам на пути к классам .Похоже, вы пытаетесь получить доступ к какому-либо ресурсу, который не находится в пути к классам.

Логика, которую getResource и getResourceAsStream используют для поиска ресурсов, по сути, одинакова.Разница между методами состоит в том, что один возвращает URL, а другой - InputStream.


Это не может быть так сложно.Есть какие-нибудь подсказки?

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

Или, если ресурс не является «частью» вашего приложения, не получайте к нему доступ таким образом.

4 голосов
/ 19 июня 2011
String clipName = "Chook.wav";

При использовании getResource передаваемая строка должна быть либо абсолютным именем, либо действительной по отношению к определенному классу.Поскольку вы используете ClassLoader.getResource(), а не Class.getResource(), это должен быть абсолютный путь.

Не видя фактическую иерархию файлов, я могу только догадываться, что «bin» является корнем ваших скомпилированных классовресурсов, и «ibm1260» является пакетом / папкой в ​​этом пути, и «Chook.wav» существует в этой папке.Если это так, то вам нужно использовать /ibm1260/Chook.wav (или потенциально ibm1260/Chook.wav, я обычно не использую загрузчик классов для поиска ресурсов) в качестве имени файла, который вы передаете getResource().

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

...