Как мне использовать getResource() в Java?

Этот вопрос задают во многих местах с множеством мелких вариаций. (Например, 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(). это имеет значение?

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


person Chap    schedule 19.06.2011    source источник
comment
Каково значение clipName?   -  person Mark Peters    schedule 19.06.2011
comment
Обновлен ориг. Почта. (Chook.wav)   -  person Chap    schedule 19.06.2011


Ответы (2)


String clipName = "Chook.wav";

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

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

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

person Mark Peters    schedule 19.06.2011
comment
bin/ — это корень (это каталог по умолчанию, созданный Eclipse). bin/ibm1620/ — это каталог, содержащий файлы *.class, как вы правильно догадались. А bin/ibm1620/Chook.wav — это ресурс. Eclipse копирует его в это место. Я взял джаз classloader.getResource() из какого-то другого поста в SO. Это, видимо, не то, что я должен использовать. Не могли бы вы конкретизировать, как использовать Class.getResource() для меня? - person Chap; 19.06.2011
comment
@Chap: Все должно быть хорошо. Вы попробовали мое предложение использовать /ibm1260/Chook.wav? Каков был результат? Обратите внимание: когда я говорю, что это должен быть абсолютный путь, я имел в виду, что он должен быть полностью определенным, точно так же, как полный путь Integer.class будет /java/lang/Integer.class. - person Mark Peters; 19.06.2011
comment
При дальнейшем чтении кажется, что ibm1260/Chook.wav - это абсолютное имя ресурса, которое вам нужно. - person Mark Peters; 19.06.2011
comment
Да!! ibm1620/Chook.wav работал. Таким образом, загрузчик классов, по-видимому, переносит один из них в корневой каталог для вывода компиляции. На самом деле я бы предпочел изолировать свои ресурсы в отдельном подкаталоге от моих файлов .class, но то, как я скажу Eclipse и/или NetBeans, что мне нужно, — это головная боль на другой вечер. - person Chap; 19.06.2011
comment
@Chap: Если ответ Марка решил проблему, отметьте его как «правильный». - person Andrew Thompson; 19.06.2011
comment
@MarkPeters, можете ли вы объяснить мне, как работает этот код ImageIcon icon = new ImageIcon(getClass().getResource("exit.png")) что на самом деле делают getResource и getClass в этом коде? @Глава - person user3414734; 08.10.2014

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

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


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

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

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

person Stephen C    schedule 19.06.2011
comment
Ну, согласно настройкам Eclipse, путь к классам — 1620. Все мои ресурсы и файлы классов находятся в /Users/chap/Documents/workspace/the1620/bin/ibm1620/. Итак, они на пути к классам или нет? - person Chap; 19.06.2011
comment
Путь к классам — 1620. ClassLoader, кажется, смотрит на файл 1620/bin. Мои файлы .class и файлы ресурсов находятся в папке 1620/bin/ibm1620. Это может быть не сложно, но это точно сбивает с толку! ;-) - person Chap; 19.06.2011
comment
В этом случае вы должны вызвать getResource(/ibm1620/Chook.wav). - person Stephen C; 19.06.2011
comment
Я потерял представление о том, о каком подходе мы здесь говорим, но в следующем: ` ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); сказать (classLoader.toString()); URL-адрес = classLoader.getResource (имя клипа); ` clipName должен быть ibm1620/Chook.wav, а НЕ /ibm1620/Chook.wav. Последнее приводит к установке URL-адреса равным нулю. Извиняюсь за ужасное форматирование здесь. Я высказал свое мнение об инструментах редактирования, известных в META. :-) - person Chap; 20.06.2011