Looking for java Keywords? Try Ask4Keywords

Java Language Поиск и чтение ресурсов с помощью загрузчика классов


пример

Загрузка ресурсов в Java включает следующие шаги:

  1. Поиск Class или ClassLoader , который найдет ресурс.
  2. Поиск ресурса.
  3. Получение байтового потока для ресурса.
  4. Чтение и обработка байтового потока.
  5. Закрытие байтового потока.

Последние три шага обычно выполняются путем передачи URL-адреса библиотечному методу или конструктору для загрузки ресурса. В этом случае вы обычно будете использовать метод getResource . Также возможно считывать данные ресурсов в коде приложения. В этом случае вы обычно будете использовать getResourceAsStream .

Абсолютные и относительные пути ресурсов

Ресурсы , которые могут быть загружены из пути к классам, обозначены пути. Синтаксис пути похож на путь файла UNIX / Linux. Он состоит из простых имен, разделенных символами прямой косой черты ( / ). Относительный путь начинается с имени, а абсолютный путь начинается с разделителя.

Как описывают примеры Classpath, путь к классам JVM определяет пространство имен путем наложения пространств имен каталогов и JAR или ZIP-файлов в пути к классам. Когда абсолютный путь разрешен, он загрузчик классов интерпретирует исходный / как смысл корня пространства имен. Напротив, относительный путь может быть разрешен относительно любой «папки» в пространстве имен. Используемая папка будет зависеть от объекта, который используется для разрешения пути.

Получение класса или загрузчика классов

Ресурс может быть расположен с использованием объекта Class или объекта ClassLoader . Объект Class может разрешать относительные пути, поэтому вы обычно используете один из них, если у вас есть (класс) относительный ресурс. Существует множество способов получить объект Class . Например:

  • Литерал класса даст вам объект Class для любого класса, который вы можете назвать в исходном коде Java; например String.class предоставляет объект Class для типа String .

  • Object.getClass() предоставит вам объект Class для типа od любого объекта; например, "hello".getClass() - это еще один способ получить Class типа String .

  • Метод Class.forName(String) будет (при необходимости) динамически загружать класс и возвращать его объект Class ; например Class.forName("java.lang.String") .

Объект ClassLoader обычно получается путем вызова getClassLoader() объекта Class . Также можно получить загрузчик классов по умолчанию JVM, используя статический ClassLoader.getSystemClassLoader() .

Методы get

Если у вас есть экземпляр Class или ClassLoader , вы можете найти ресурс, используя один из следующих способов:

методы Описание
ClassLoader.getResource(path)
ClassLoader.getResources(path)
Возвращает URL-адрес, который представляет местоположение ресурса с заданным путем.
ClassLoader.getResources(path)
Class.getResources(path)
Возвращает Enumeration<URL> указывающее URL-адреса, которые можно использовать для поиска ресурса foo.bar ; увидеть ниже.
ClassLoader.getResourceAsStream(path)
Class.getResourceStream(path)
Возвращает InputStream из которого вы можете прочитать содержимое ресурса foo.bar в виде последовательности байтов.

Заметки:

  • Основное различие между версиями методов ClassLoader и Class заключается в том, как интерпретируются относительные пути.

    • Методы Class разрешают относительный путь в папке, соответствующей пакету классов.
    • Методы ClassLoader обрабатывают относительные пути, как если бы они были абсолютными; т.е. разрешить их в «корневой папке» пространства имен classpath.
  • Если запрошенный ресурс (или ресурсы) не может быть найден, methods return getResource и getResourceAsStream methods return null , and the methods return an empty getResources methods return an empty перечисление.

  • URL.toStream() URL-адреса будут URL.toStream() с помощью URL.toStream() . Они могут быть file: URL-адресами или другими обычными URL-адресами, но если ресурс находится в JAR-файле, они будут jar: URL-адресами, которые идентифицируют JAR-файл и определенный ресурс внутри него.

  • Если ваш код использует метод getResourceAsStream (или URL.toStream() ) для получения InputStream , он отвечает за закрытие объекта потока. Невозможность закрыть поток может привести к утечке ресурсов.