Java LanguageРесурсы (на пути к классам)

Вступление

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

замечания

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

Доступ к ресурсам можно получить с помощью методов ClassLoader.getResource и ClassLoader.getResourceAsStream . Наиболее распространенным случаем является наличие ресурсов, размещенных в том же пакете, что и класс, который их читает; методы Class.getResource и Class.getResourceAsStream служат этому обычному варианту использования.

Единственное различие между методом getResource и методом getResourceAsStream заключается в том, что первый возвращает URL-адрес, а второй открывает этот URL-адрес и возвращает InputStream.

Методы ClassLoader принимают имя типа пути как аргумент и ищут каждое местоположение в пути класса ClassLoader для записи, соответствующей этому имени.

  • Если местоположение класса является файлом .jar, запись в jar с указанным именем считается совпадением.
  • Если расположение пути к классам является каталогом, относительный файл в этом каталоге с указанным именем считается совпадением.

Имя ресурса похоже на часть пути относительного URL. На всех платформах он использует косые черты ( / ) в качестве разделителей каталогов. Он не должен начинаться с косой черты.

Соответствующие методы класса аналогичны, за исключением:

  • Имя ресурса может начинаться с косой черты, и в этом случае начальная косая черта удаляется, а остальная часть имени передается соответствующему методу ClassLoader.
  • Если имя ресурса не начинается с косой черты, оно рассматривается как относительное к классу, вызываемому методом getResource или getResourceAsStream. Фактическое имя ресурса становится package / name , где package - это имя пакета, к которому принадлежит класс, причем каждый период заменяется косой чертой, а имя - исходным аргументом, заданным для метода.

Например:

package com.example;

public class ExampleApplication {
    public void readImage()
    throws IOException {

        URL imageURL = ExampleApplication.class.getResource("icon.png");

        // The above statement is identical to:
        // ClassLoader loader = ExampleApplication.class.getClassLoader();
        // URL imageURL = loader.getResource("com/example/icon.png");

        Image image = ImageIO.read(imageURL);
    }
}

Ресурсы должны размещаться в именованных пакетах, а не в корневом каталоге .jar, по той же причине классы помещаются в пакеты: Чтобы предотвратить столкновение между несколькими поставщиками. Например, если несколько файлов .jar находятся в пути к классам, и более чем один из них содержит запись config.properties в своем корне, вызовы методов getResource или getResourceAsStream возвращают параметры config.properties из того, что .jar указан первым в путь к классам. Это не предсказуемое поведение в средах, где порядок пути к классам не находится под непосредственным контролем приложения, например Java EE.

Все методы getResource и getResourceAsStream возвращают значение null если указанный ресурс не существует. Поскольку ресурсы должны быть добавлены в приложение во время сборки, их местоположения должны быть известны при написании кода; отказ найти ресурс во время выполнения обычно является результатом ошибки программиста.

Ресурсы доступны только для чтения. Невозможно написать ресурс. Разработчики новичка часто ошибаются, полагая, что, поскольку ресурс является отдельным физическим файлом при разработке в среде IDE (например, Eclipse), безопасно рассматривать его как отдельный физический файл в общем случае. Однако это неверно; приложения почти всегда распространяются как архивы, такие как файлы .jar или .war, и в таких случаях ресурс не будет отдельным файлом и не будет доступен для записи. (Метод getFile для класса URL-адресов не является обходным путем для этого, несмотря на его имя, он просто возвращает часть пути URL-адреса, которая отнюдь не гарантирует, что это действительное имя файла).

Не существует безопасного способа перечислить ресурсы во время выполнения. Опять же, поскольку разработчики несут ответственность за добавление файлов ресурсов в приложение во время сборки, разработчики должны уже знать их пути. Хотя есть обходные пути, они не надежны и в конечном итоге потерпят неудачу.

Ресурсы (на пути к классам) Связанные примеры