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
метод.
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; }
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.
Если ресурс находится в каталоге:
getResource()
вызовы будут использовать File.exists()
определить, сделать ли соответствующий файл видимым пользователю. Вспомните это File.exists()
использование checkRead()
метод в менеджере безопасности.getResourceAsStream()
.Если ресурс находится в файле JAR:
getResource()
вызовы успешно выполнятся для всех файлов, независимо от того, делается ли вызов изнутри системы или несистемного класса.getResourceAsStream()
вызовы успешно выполнятся для не.class ресурсы, и для - также java.net.URL.getContent()
на соответствующих URL.Этот раздел обеспечивает два примера клиентского кода. Первый пример использует "абсолютный ресурс" имена и традиционные механизмы, чтобы получить 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. }