Загрузка ресурсов с использованием getClass (). GetResource () - PullRequest
21 голосов
/ 26 февраля 2010

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

protected ImageIcon createImageIcon(String path, String description) 
{
    java.net.URL imgURL = getClass().getResource(path);
    if (imgURL != null) {
        return new ImageIcon(imgURL, description);
    } else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }
}

Итак, я поместил местоположение файла и передал его в качестве параметра этой функции. Это не сработало, то есть imgURL был нулевым. Когда я попытался создать ImageIcon, явно указав путь:

ImageIcon icon  = new ImageIcon(path,"My Icon Image");

Отлично сработало! Таким образом, приложение может подобрать изображение по явно заданному пути, но не взяло изображение с помощью getResources (). В обоих случаях значение переменной пути одинаково. Почему бы это не сработало? Как ресурсы обнаруживаются загрузчиком классов?

Спасибо.

Ответы [ 4 ]

16 голосов
/ 26 февраля 2010

getClass().getResource(path) загружает ресурсы из пути к классам, а не из пути к файловой системе.

15 голосов
/ 26 февраля 2010

Вы можете запросить путь в следующем формате:

/package/path/to/the/resource.ext

Даже байты для создания классов в памяти находятся следующим образом:

my.Class -> /my/Class.class

и getResource предоставят вам URL, который можно использовать для получения InputStream.

Но ... Я бы рекомендовал использовать getClass().getResourceAsStream(...) напрямую с тем же аргументом, потому что он возвращает напрямую InputStream и не нужно беспокоиться о создании (возможно, сложного) объекта URL, который должен знать, как создать InputStream.

Вкратце: попробуйте использовать getResourceAsStream и какой-нибудь конструктор ImageIcon, который использует InputStream в качестве аргумента.

1020 * загрузчиков классов *

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

Редактировать: classpath

getResource - как говорит mattb - для загрузки ресурсов из classpath (из вашего каталога .jar или classpath). Если вы связываете приложение, то его приятно иметь вместе, поэтому вы можете включить файл значков в банку вашего приложения и получить его таким образом.

9 голосов
/ 21 января 2017

Я был в замешательстве, пока не понял, что так называемый "путь" - это путь относительно к файлу MyClass. class в файловая система, а не файл MyClass. java . Моя IDE копирует ресурсы (например, xx.jpg, xx.xml) в каталог, локальный для MyClass.class. Например, внутри каталога pkg, называемого target / classes / pkg. Расположение файла класса может отличаться для разных IDE и в зависимости от структуры сборки для вашего приложения. Сначала следует изучить файловую систему и найти расположение файл MyClass.class и скопированное местоположение связанного ресурса, который вы хотите извлечь, затем определите путь относительно файла MyClass.class и запишите его как строковое значение с точками и косыми чертами.

Например, вот как я делаю файл app1.fxml доступным для моего приложения javafx, где соответствующий «MyClass.class» неявно является «Main.class». В файле Main.java содержится эта строка кода вызова ресурсов. В моем конкретном случае ресурсы копируются в место на том же уровне, что и папка с вложенным пакетом. Это: /target/classes/pkg/Main.class и /target/classes/app1.fxml. Итак, перефразируя ... относительная ссылка "../app1.fxml" это "начать с Main.class, перейти на один уровень вверх каталога, теперь вы можете увидеть ресурс".

FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("../app1.fxml"));

Обратите внимание, что в этой строке относительного пути "../app1.fxml" первые две точки ссылаются на каталог, содержащий Main.class и один "." указывает расширение файла для подражания. После того, как эти детали станут второй натурой, вы забудете, почему это сбивало с толку.

0 голосов
/ 09 апреля 2018

getResource по примеру:

package szb.testGetResource;
public class TestGetResource {
    private void testIt() {
        System.out.println("test1: "+TestGetResource.class.getResource("test.css"));
        System.out.println("test2: "+getClass().getResource("test.css"));
    }
    public static void main(String[] args) {
        new TestGetResource().testIt();
    }
}

enter image description here

выход:

test1: file:/home/szb/projects/test/bin/szb/testGetResource/test.css
test2: file:/home/szb/projects/test/bin/szb/testGetResource/test.css
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...