Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

Независимый от расположения Доступ к Ресурсам

Краткий обзор

Ресурс является данными (изображения, аудио, текст, и так далее), к которому программа должна получить доступ в пути, который независим от расположения кода программы. Программы Java могут использовать два механизма, чтобы получить доступ к ресурсам: использование Апплетов Applet.getCodeBase() чтобы получить базовый URL для апплета кодируют и затем расширяют базовый URL с помощью относительного пути, чтобы загрузить требуемый ресурс, например с помощью Applet.getAudioClip(url). Приложения используют "известные расположения" такой как System.getProperty("user.home") или System.getProperty("java.home"), тогда добавьте "/lib/resource", и открытый тот файл.

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

Эти методы не оказывают определенную поддержку для того, чтобы определить местоположение локализованных ресурсов. Локализованные ресурсы поддерживаются средствами интернационализации.

Ресурсы, имена, и контексты

Ресурс идентифицируется строкой, состоящей из последовательности подстрок, разграниченных наклонными чертами (/), сопровождаемый именем ресурса. Каждая подстрока должна быть допустимым идентификатором Java. Имя ресурса имеет форму shortName или shortName.extension. Оба shortName и extension должны быть идентификаторы Java.

Имя ресурса независимо от реализации Java; в частности разделитель пути всегда является наклонной чертой (/). Однако, реализация Java управляет деталями того, как содержание ресурса отображается в файл, базу данных, или другой объект, содержащий фактический ресурс.

Интерпретация имени ресурса относительно экземпляра загрузчика класса. Методы, реализованные ClassLoader класс делает эту интерпретацию.

Системные ресурсы

Системный ресурс является ресурсом, который или встроен к системе, или сохраненный реализацией узла в, например, локальная файловая система. Системные ресурсы доступа программ через ClassLoader методы getSystemResource и getSystemResourceAsStream.

Например, в определенной реализации, определяя местоположение системного ресурса может включить поиск записей в ПУТЬ К КЛАССУ. ClassLoader методы ищут каждый каталог, файл ZIP, или запись файла JAR в ПУТИ К КЛАССУ для файла ресурсов, и, если найдено, возвращает любого InputStream, или имя ресурса. Если не найденный, методы возвращают нуль. Ресурс может быть найден в различной записи в ПУТИ К КЛАССУ чем расположение, где файл класса был загружен.

Несистемные Ресурсы

Реализация getResource на классе загрузчик зависит от деталей ClassLoader класс. Например, AppletClassLoader:

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

Имена ресурса

Общее соглашение для имени ресурса, используемого классом, состоит в том, чтобы использовать полностью определенное имя пакета класса, но преобразовать все периоды (.) в наклонные черты (/), и добавить имя ресурса формы name.extension. Поддерживать это, и упростить обработку деталей системных классов (для который getClassLoader нуль возвратов), класс Class обеспечивает два метода удобства, которые призывают соответствующие методы ClassLoader.

Имя ресурса, данное a Class у метода может быть запуск начальной буквы "/", который идентифицирует его как "абсолютное" имя. Имена ресурса, которые не запускаются с "/", "относительны".

Абсолютные имена лишаются их запуска "/" и передаются, без дальнейшей модификации, к соответствующему ClassLoader метод, чтобы определить местоположение ресурса. Относительные имена изменяются согласно соглашению, описанному ранее, и затем передаются к a ClassLoader метод.

Используя Методы java.lang. Класс

Class класс реализует несколько методов для того, чтобы загрузить ресурсы.

Метод getResource() возвращает URL для ресурса. URL (и его представление) является определенным для реализации и JVM (то есть, URL, полученный в одном экземпляре времени выполнения, возможно, не работает в другом). Его протокол является обычно определенным для ClassLoader загрузка ресурса. Если ресурс не существует или не видим из-за соображений безопасности, методы возвращают нуль.

Если клиентский код хочет считать содержание ресурса как InputStream, это может применяться openStream() метод на URL. Это достаточно распространено, чтобы выровнять по ширине добавление getResourceAsStream() к Class и ClassLoader. getResourceAsStream() то же самое как вызов getResource().openStream(), за исключением того, что getResourceAsStream() выгоды исключения IO возвращают нуль InputStream.

Клиентский код может также запросить содержание ресурса как объект, применяясь java.net.URL.getContent() метод на URL. Это полезно, когда ресурс содержит данные для изображения, например. В случае изображения результат awt.image.ImageProducer объект, не Image объект.

getResource и getResourceAsStream методы находят ресурс с именем. Они возвращают нуль, если они не находят ресурс с указанным именем. Правила для того, чтобы искать ресурсы, связанные с данным классом, реализуются ClassLoder класса. Class методы делегируют к ClassLoader методы, после применения соглашения о присвоении имен: если имя ресурса запускается с "/", оно используется как есть. Иначе, имя пакета предварительно ожидается после преобразования всех периодов (.) к наклонным чертам (/).

public InputStream getResourceAsStream(String name) {
  name = resolveName(name);
  ClassLoader cl = getClassLoader();
  if (cl==null) {
    return ClassLoader.getSystemResourceAsStream(name); // A system class.
  }
  return cl.getResourceAsStream(name);
}

public java.net.URL getResource(String name) {
  name = resolveName(name);
  ClassLoader cl = getClassLoader();
  if (cl==null) {
    return ClassLoader.getSystemResource(name);  // A system class.
  }
  return cl.getResource(name);
}

resolveName метод добавляет префикс имени пакета, если имя не является абсолютным, и удаляет какое-либо продвижение "/", если имя является абсолютным. Возможно, хотя редкий, иметь классы в diffent пакетах, совместно использующих тот же самый ресурс.

private String resolveName(String name) {
  if (name == null) {
    return name;
  }
  if (!name.startsWith("/")) {
    Class c = this;
    while (c.isArray()) {
      c = c.getComponentType();
    }
    String baseName = c.getName();
    int index = baseName.lastIndexOf('.');
    if (index != -1) {
      name = baseName.substring(0, index).replace('.', '/') + "/" + name;
    }
  } else {
    name = name.substring(1);
  }
  return name;
}

Используя Методы java.lang. ClassLoder

ClassLoader у класса есть два набора методов, чтобы получить доступ к ресурсам. Один набор возвращается InputStream для ресурса. Другой набор возвращает URL. Методы, которые возвращаются InputStream легче использовать и удовлетворит много потребностей, в то время как методы, которые возвращают URL, обеспечивают доступ к более сложной информации, такой как Изображение и AudioClip.

ClassLoaderресурсы чесоток так же к пути это управляет классами. A ClassLoader средства управления, как отобразить имя ресурса к его контенту. ClassLoader также обеспечивает методы для того, чтобы они получили доступ к системным ресурсам, аналогичным системным классам. Class класс обеспечивает некоторые методы удобства, которые делегируют функциональность к ClassLoader методы.

Много программ Java получат доступ к этим методам косвенно через I18N (локализация) API. Другие получат доступ к этому через методы в Class. Некоторые непосредственно вызовут ClassLoader методы.

Методы в ClassLoader используйте данную Строку в качестве имени ресурса, не применяя абсолютного/относительного преобразования (см. методы в Классе). У имени не должно быть продвижения "/".

Системные ресурсы - те, которые обрабатываются узлом implemenation непосредственно. Например, они могут быть расположены в ПУТИ К КЛАССУ.

Имя ресурса "/" - разделенная последовательность идентификаторов. Class класс обеспечивает методы удобства для того, чтобы они получили доступ к ресурсам; методы реализуют соглашение, где имя пакета снабжается префиксом к краткому названию ресурса.

К ресурсам можно получить доступ как InputStream, или URL.

getSystemResourceAsStream метод возвращает InputStream для указанного системного ресурса или нуля, если это не находит ресурс. Имя ресурса может быть любым системным ресурсом.

getSystemResource метод находит системный ресурс с указанным именем. Это возвращает URL ресурсу или нулю, если это не находит ресурс. Вызов java.net.URL.getContent() с URL возвратит объект такой как ImageProducer, AudioClip, или InputStream.

getResourceAsStream метод возвращается InputStream для указанного ресурса или нуля, если это не находит ресурс.

getResource метод находит ресурс с указанным именем. Это возвращает URL ресурсу или нулю, если это не находит ресурс. Вызов java.net.URL.getContent() с URL возвратит объект такой как ImageProducer, AudioClip, или InputStream.

Безопасность

С тех пор getResource() обеспечивает доступ к информации, у него должны быть четко определенные и обоснованные правила безопасности. Если соображения безопасности не позволяют ресурсу быть видимым в некотором контексте защиты, getResource() метод перестанет работать (возвратите нуль), как будто ресурс не присутствовал вообще, это адресует атаки существования.

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

Нет никаких указанных вопросов безопасности или ограничений относительно ресурсов, которые находятся несистемным загрузчиком класса. AppletClassLoader обеспечивает доступ к информации, которая загружается из исходного расположения, или индивидуально, или в группе через файл JAR; таким образом AppletClassLoader должен применить то же самое checkConnect() правила, имея дело с URL через getResource().

Система ClassLoader обеспечивает доступ к информации в ПУТИ К КЛАССУ. ПУТЬ К КЛАССУ Может содержать файлы JAR и каталоги. Так как файл JAR создается преднамеренно, у него есть различное значение чем каталог, где вещи могут закончиться более случайном способе. В частности мы более строги при получении информации из каталога чем из файла JAR.

Если ресурс находится в каталоге:

Если ресурс находится в файле JAR:

Примеры

Этот раздел обеспечивает два примера клиентского кода. Первый пример использует "абсолютный ресурс" имена и традиционные механизмы, чтобы получить a Class объект.

package pkg;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;

class Test {

  private static final String absName = "/pkg/mumble.baf";

  public static void test1() {
    Class c=null;
    try {
      c = Class.forName("pkg.Test");
    } catch (Exception ex) {
      // This should not happen.
    }
    InputStream s = c.getResourceAsStream(absName);
    // do something with it.
  }

  public void test2() {
    InputStream s = this.getClass().getResourceAsStream(absName);
  // do something with it.
  }
}

Этот пример использует "относительный ресурс" имена и механизм, доступный от компилятора до -experimental флаг, чтобы получить a Class объект.

package pkg;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;

class Test {
  private static final String relName = "mumble.baf";
  public static void test1() {
  InputStream s = Test.class.getResourceAsStream(relName);
  // do something with it.
}

  public void test2() {
    InputStream s = Test.class.getResourceAsStream(relName);
    // do something with it.
  }

Ссылки API


Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами