Как найти ресурсы в файле

If I have a collection of resource files in a directory on my classpath, I can enumerate them using ClassLoader.getResources(location).

For example if I have /mydir/myresource.properties on the classpath, I can call the classloader’s getResources("mydir") and get an enumeration of URLs containing myresource.properties.

When I pack up the exact same resources into a .jar, I don’t get anything in the enumeration of URLs when I make the call. I’ve only replaced the folder structure with a jar containing those folders (it’s a webapp, so the jar is going into /WEB-INF/lib). I’ve also got a number of other calls using getResourceAsStream(location) to get other resources individually by name and they’re all working fine.

What’s different about enumerating resources when the resources are in a .jar?


Update – I’ve reproduced (ish) the behaviour outside the container. The following snippet results in the dirProperties object having keys set to the resource names in the package, but if the package is in a .jar throws a NullPointerException during the Properties.load(InputStream) method.

Properties dirProperties = new Properties();
dirProperties.load(this.getClass().getClassLoader().getResourceAsStream(location));

The same code on the container (Tomcat 5.5) throws no exception but produces an empty Properties object when the files are in a .jar.

Здравствуйте, уважаемые знатоки.
Подскажите пожалуйста как найти ресурс по имени в конкретном ресурсном файле.
Например есть names.xml с кодом:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="name1">Ab</string>
  <string name="name2">Ac</string>
  <string name="name3">Ad</string>
</resources>

Надо найти значение name2:

myName="name2";

Я знаю как найти это во всех ресурсных файлах, но мне нужно в конкретном names.xml:

int settId = getResources().getIdentifier("name2", "string", getPackageName());
myName = getString(settId);

Real KEK's user avatar

Real KEK

1,33114 серебряных знаков30 бронзовых знаков

задан 21 янв 2017 в 12:24

lmihael's user avatar

Без каких-то дополнительных действий – никак. Система сборки объединяет все ресурсы в один файл, имена исходных файлов теряются. Используйте префикс для этой группы ресурсов, либо создайте список в коде или в ресурсе с помощью <string-array>

ответ дан 21 янв 2017 в 14:53

tse's user avatar

tsetse

3,71610 серебряных знаков25 бронзовых знаков

1

Ресурсы

Работа с ресурсами

Последнее обновление: 15.10.2021

Ресурс в приложении Android представляет собой файл, например, файл разметки интерфейса или некоторое значение, например,
простую строку. То есть ресурсы представляют собой и файлы разметки, и отдельные строки, и звуковые файлы, файлы изображений и т.д.
Все ресурсы находятся в проекте в каталоге res. Для различных типов ресурсов, определенных в проекте, в каталоге res
создаются подкаталоги. Поддерживаемые подкаталоги:

  • animator/: xml-файлы, определяющие анимацию свойств

  • anim/: xml-файлы, определяющие tween-анимацию

  • color/: xml-файлы, определяющие список цветов

  • drawable/: Графические файлы (.png, .jpg, .gif)

  • mipmap/: Графические файлы, используемые для иконок приложения под различные разрешения экранов

  • layout/: xml-файлы, определяющие пользовательский интерфейс приложения

  • menu/: xml-файлы, определяющие меню приложения

  • raw/: различные файлы, которые сохраняются в исходном виде

  • values/: xml-файлы, которые содержат различные используемые в приложении значения, например, ресурсы строк

  • xml/: Произвольные xml-файлы

  • font/: файлы с определениями шрифтом и расширениями .ttf, .otf или .ttc, либо файлы XML,
    который содержат элемент <font-family>

В общей сложности мы можем определить следующие типы ресурсов:

Ресурс

Каталог проекта

Файл

элемент в файле

Строки

/res/values/

strings.xml

<string>

Plurals

/res/values/

strings.xml

<plurals>

Массивы строк

/res/values/

strings.xml или arrays.xml

<string-array>

Логические значения Boolean

/res/values/

bools.xml

<bool>

Цвета

/res/values/

colors.xml

<color>

Список цветов

/res/color/

Произвольное название

<selector>

Размеры (Dimensions)

/res/values/

dimens.xml

<dimen>

Идентификаторы ID

/res/values/

ids.xml

<item>

Целые числа

/res/values/

integers.xml

<integer>

Массив целых чисел

/res/values/

integers.xml

<integer-array>

Графические файлы

/res/drawable/

Файлы с расширением jpg и png

Tween-анимация

/res/anim/

Файл xml с произвольным названием

<set>, <alpha>, <rotate>, <scale>, <translate>

Покадровая анимация

/res/drawable/

Файл xml с произвольным названием

<animation-list>

Анимация свойств

/res/animator/

Файл xml с произвольным названием

<set>, <objectAnimator>, <valueAnimator>

Меню

/res/menu/

Файл xml с произвольным названием

<menu>

XML-файлы

/res/xml/

Файл xml с произвольным названием

Бинарные и текстовые ресурсы

/res/raw/

Файлы мультимедиа (mp3, mp4), текстовые и другие файлы

Разметка графического интерфейса

/res/layout/

Файл xml с произвольным названием

Стили и темы

/res/values/

styles.xml, themes.xml

<style>

К примеру, если мы возьмем стандартный проект Android Studio, который создается по умолчанию, то там можем заметить наличие уже нескольких папок для различных
ресурсов в каталоге res:

Ресурсы в Android Studio

По умолчанию здесь есть каталоги не для всех типов ресурсов, которые использоваться в Android, однако при необходимости мы можем добавить в папку
res нужный каталог, а в него затем поместить ресурс.

Когда происходит компиляция проекта сведения обо всех ресурсах добавляются в специальный файл R.jar, который затем используется
при работе с ресурсами

Применение ресурсов

Существует два способа доступа к ресурсам: в файле исходного кода и в файле xml.

Ссылка на ресурсы в коде

Тип ресурса в данной записи ссылается на одно из пространств (вложенных классов), определенных в файле R.java,
которые имеют соответствующие им типы в xml:

  • R.drawable (ему соответствует тип в xml drawable)

  • R.id (id)

  • R.layout (layout)

  • R.string (string)

  • R.attr (attr)

  • R.plural (plurals)

  • R.array (string-array)

Например, для установки ресурса activity_main.xml в качестве графического интерфейса в коде MainActivity в методе onCreate() есть такая строка:

setContentView(R.layout.activity_main);

Через выражение R.layout.activity_main мы и ссылаемся на ресурс activity_main.xml, где layout – тип ресурса, а activity_main – имя ресурса.

Подобным образом мы можем получать другие ресурсы. Например, в файле res/values/strings.xml определен ресурс app_name:

<resources>
    <string name="app_name">ViewApp</string>
</resources>

Этот ресурс ссылается на строку. Чтобы получить ссылку на данный ресурс в коде java, мы можем использовать выражение R.string.app_name.

Доступ в файле xml

Нередко возникает необходимость ссылаться на ресурс в файле xml, например, в файле, который определяет визуальный интерфейс, к примеру, в
activity_main.xml. Ссылки на ресурсы в файлах xml имеют следующую формализованную форму: @[имя_пакета:]тип_ресурса/имя_ресурса

  • имя_пакета представляет имя пакета, в котором ресурс находится (указывать необязательно, если ресурс находится в том же пакете)

  • тип_ресурса представляет подкласс, определенный в классе R для типа ресурса

  • имя_ресурса имя файла ресурса без расширения или значение атрибута android:name в XML-элементе
    (для простых значений).

Например, мы хотим вывести в элемент TextView строку, которая определена в виде ресурса в файле strings.xml:

<TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_name" />

В данном случае свойство text в качестве значения будет получать значение строкового ресурса app_name.

Метод getResources

Для получения ресурсов в классе Activity мы можем использовать метод getResources(), который возвращает объект
android.content.res.Resources. Но чтобы получить сам ресурс, нам надо у полученного объекта Resources вызвать один из методов. Некоторые из его методов:

  • getString(): возвращает строку из файла strings.xml по числовому идентификатору

  • getDimension(): возвращает числовое значение – ресурс dimen

  • getDrawable(): возвращает графический файл в виде объекта Drawable

  • getBoolean(): возвращает значение boolean

  • getColor(): возвращает определение цвета

  • getColorStateList(): возвращает объект ColorStateList – набор цветов

  • getFont(): возвращает определение шрифта в виде объекта Typeface

  • getFloat(): возвращает значение float

  • getLayout(): возвращает объект XmlResourceParser, связанный с файлом layout

Это только некоторые методы. Но все они в качестве параметра принимают идентификатор ресурса, который надо получить. Вкратце рассмотрим их
применение. Возьмем тот же файл res/values/strings.xml в качестве источника ресурсов, который в моем случае выглядит так:

<resources>
    <string name="app_name">ViewApp</string>
</resources>

И изменим код MainActivity:

package com.example.viewapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
        // получение ресурсов из файла values/strings.xml
        String app_name = getResources().getString(R.string.app_name);

        TextView textView = new TextView(this);
        textView.setTextSize(30);
        textView.setText(app_name);

        setContentView(textView);

    }
}

Здесь, используя метод getResources() получаем все ресурсы и затем используем их для устаноки значений свойств графических
элементов. При запуске приложения мы увидим применение полученных ресурсов:

Использование ресурсов в Android Studio

Подобным образом мы можем программно получать и другие ресурсы и использоват их в приложении.
Однако следует отметить, что в данном случае нам не нужно использовать метод getResources() и вообще производить какие-то определенные действия по получению ресурса,
поскольку метод setText() класса TextView поддерживает прямую установку текста по идентификатору ресурса:

textView.setText(R.string.app_name);

Привет, друзья. В этой публикации рассмотрим такой вопрос: как найти файл по содержимому. Т.е. по каким-то отдельным ключевым словам или словосочетаниям. Если вам нужно найти на своём компьютере какой-то документ или текстовый файл, при этом вы не помните его название, но вам чётко врезались в память отдельные слова или фразы с этого документа, вы найдёте этот документ. Правда, поиск в проводнике Windows для этих целей не годится, его лучше использовать только для поиска данных по ключевым фразам в названиях файлов. Для поиска по текстовому содержимому файлов необходимо прибегнуть к различным сторонним программам. И мы рассмотрим несколько таких – Total Commander, Everything, Archivarius 3000.

Как найти файл по содержимому

***

Друзья, к рассмотрению темы, как найти файл по содержимому, меня подтолкнула просьба о помощи одного читателя сайта:

Здравствуйте, админ. Проблема такая: срочно нужно найти файл по его содержимому среди целой кучи других похожих файлов, находящихся на жёстком диске моего компьютера. У меня на диске D находится много папок с файлами, и среди них есть текстовый файл с решением одной математической задачи. Но я помню только часть исходных данных y0= (4*2-22)/4=1, более ничего не помню. Расширение файла тоже не помню, это может быть «.txt», «.doc», «.xlsx», «.ttf» и даже «.phtml» или «.php3». Пробовал применить программу Multi Text Finder, но она ничего не нашла.

Программа Multi Text Finder, друзья, с виду вроде бы серьёзная, в ней можно выбирать типы документов для поиска, ключевые слова для поиска по содержимому документов, можно использовать маски поиска. Но, увы, это программа совершено бесполезна, найти файлы, содержащие текст, она не может. Возможно, в какой-то части случаев она и работает, но мой тест показал её полную непригодность. Я указал место поиска, ввёл ключевое слово, запустил поиск. Но поиск ничего не обнаружил.

Хотя по указанному пути документ не то, что с ключевым словом внутри, с ключевым словом в названии есть.

Увы, так бывает. Эту программу мы, друзья, отправим в топку. И давайте посмотрим на эффективные программы, которые реально помогут нам найти нужный файл, содержащий текст, какой мы помним.


Примечание: друзья, проводник Windows не ищет файлы по их внутреннему содержимому, но у него есть иные критерии поиска, с помощью которых вы можете сузить область поиска нужного вам файла. Как работать с поиском в системном проводнике, смотрите в статье «Как найти файл на компьютере».


Total Commander

Поиск файлов по ключевым словам в их тексте предусматривает функциональный файловый менеджер Total Commander. Эта программа сможет найти исчезнувший на вашем компьютере файл и по содержащемуся тексту, и по названию, и по расширению, и по дате создания, и по различным атрибутам. Ну и также у Total Commander много прочих интересных возможностей для опытных пользователей, так что если вы никогда не пользовались этим файловым менеджером, решение вашей проблемы может стать идеальным поводом для знакомства с ним и исследования прочих его возможностей.

Как найти файл по содержимому в Total Commander? На его панели инструментов есть кнопка поиска файлов, кликаем её. Или можем использовать горячие клавиши Alt+F7.

В форме поиска выбираем место поиска, можем указать весь раздел диска, на котором предположительно хранится нужный нам файл. И вводим ключевой запрос. Если мы его введём в графу «Искать файлы», поиск будет выполнен по названиям файлов. Если же мы активируем графу «С текстом» и в неё впишем ключевой запрос, то поиск будет выполняться по содержимому файлов. Что, собственно, и нужно нам. Вписываем в графу «С текстом» те слова или фразы, которые мы помним. И жмём «Начать поиск».

И далее по мере выполнения поиска на нижней панели окошка мы получим результаты поиска. И вот нам удалось найти файл, содержащий текст, который мы помним. 

А вот и сам файл.

Чтобы поиск выполнялся быстрее, нужно максимально сузить его область, т.е. указать более точный путь нахождения файла. И тогда процедура поиска займёт меньше времени.

Everything 

Друзья, для поиска файлов на Windows-компьютере есть специальные программы. Одна из них – бесплатная Everything. Очень простая и удобная, может работать обычно с установкой в Windows, и также может работать портативно. Ищет файлы по именам и содержимому, предусматривает расширенный поиск с разными настройками и фильтрами. Программа изначально выполняет индексацию содержимого компьютера, и благодаря этому поиск файлов выполняется мгновенно, гораздо быстрее, чем в проводнике Windows. Но индексация проводится только по именам файлов и, соответственно, мгновенный поиск возможен, если мы вводим ключевое слово в названии документа. Внутреннее содержимое файлов программа не индексирует, и, соответственно, если нам понадобится найти файлы, содержащие текст, придётся подождать, этот процесс может быть небыстрым.

Итак, программа Everything. Дабы искать в ней файлы по названиям, вводим ключевое слово из названия в поле программы в её главном окне.

Если же мы хотим найти файл, содержащий текст, в меню «Поиск» запускаем «Расширенный поиск».

Указываем ключевые слово или фразу. И желательно указать местоположение искомого файла, хотя бы примерное, хотя бы просто раздел диска. Если хотите, можете использовать другие фильтры и настройки расширенного поиска. 

И, вуаля – файл найден.

FileSearchy

Archivarius 3000

И ещё одну программу, друзья, рассмотрим, которая может найти файлы, содержащие текст, какой мы помним – это программа Archivarius 3000. Но это программа максимум-уровня, это суперфункциональный внутрисистемный поисковик файлов, включающий возможность поиска документов по их содержимому. И такой поиск программа выполнят мгновенно за счёт индексации содержимого указанных нами областей компьютера. Это не программа-однодневка, она платная, нужна она не всем, а только тем, кто постоянно работает с документами, у кого на компьютере хранятся большие их базы, и кому принципиально нужна оперативность и эффективность при поиске данных. Archivarius 3000 изначально индексирует указанные нами пути хранения документов, и впоследствии периодически также выполняет индексацию, чтобы в индексе всегда были актуальные сведения.

Механизм поиска у Archivarius 3000 такой, как у поисковых систем: программный поисковик ищет файлы не только с прямым вхождением наших ключевых запросов, но также с изменёнными словоформами, т.е. с разными падежами существительных и прилагательных имён, с разными временами глаголов и прочими морфологическими изменениями. И также при поиске учитывается плотность ключевых слов, а результаты поиска выстраиваются по релевантности. Друзья, программа очень серьёзная, у неё настраиваемый механизм индексации, собственный просмотрщик документов. Более того, программа даже может обеспечивать удалённый доступ к нашей базе документов по принципу сервера, и мы сможем искать файлы на нашем компьютере, будучи далеко от него, по сути, из любой точки мира. Так что в нескольких словах об этой программе не расскажешь, она достойна отдельного обзора. Покажу лишь, как пользоваться настроенной программой.

Как найти файл по содержимому с использованием Archivarius 3000? Вводим ключевой запрос, будь это слова из названия, будь это слова в тексте документа. И отсматриваем результаты поиска. Смотрим, где встречается все слова из нашего запроса.

При необходимости можем задействовать фильтры поиска – атрибуты в терминологии самой программы.

[size=medium]

В соответствии с различной семантикой способ поиска класса или ресурса обычно отличается: класс или ресурс, поиск которых выполняется в семантике сервлета, должен находиться в корневом каталоге WEB, класс или ресурс, поиск в которых выполняется в семантике URLClassloader, находится в указанном URL-адресе;

[b] [color = red] Хотя класс или ресурс, который ищет java.io.File, специфичен для локальной файловой системы, абстрактное представление файлов экземпляра файла и пути к каталогу не означает, что в файловой системе есть соответствующие каталоги или файлы, Вы можете использовать метод exist, чтобы определить, существует ли файл, при создании экземпляра File вам нужно передать строку, представляющую путь, так же, как значение getPath – просто вернуть саму строку, если строка выражает относительный путь, используйте его и файл Перед взаимодействием с системой необходимо добавить префикс. Здесь рабочий каталог определяется System.getProperty (“user.dir”). Префикс и входящая строка совместно определяют уникальность файла. Еще предстоит проделать небольшую работу. После объединения он формирует строку, которая может выражать абсолютный путь. Хотя он может выражать значение «абсолютного пути», он может не приниматься определенными операционными системами, такими как «..», некоторые операционные системы могут обрабатывать эти детали внутренне, но Эта ответственность должна нести друг перед другом JVM-заявитель. Для JVM путь должен быть нормализован для взаимодействия с операционной системой [/ color]. [/ Б]

getPath возвращает входящую строку, которая создает экземпляр File

getAbsolutePath возвращает абсолютный путь: удалите ненужные “/” или разделители файлов входящей строки

getCanonicalPath возвращает абсолютный путь: удалите ненужные «,» или файловые разделители входящей строки; одновременно удалите лишние «.» или «..»; изменение возвращаемого значения является единственным стандартным представлением файловой системы

Если входящий путь является относительным, используйте System.getProperty (“user.dir”), чтобы получить полный путь

[color = red] Примечание: Экземпляр File представляет файл локальной системы. Если файл существует, вы можете использовать FileOutputStream или FileInputStream для работы с локальным файлом, но для файлов в сжатом файле многие операции экземпляра File не могут быть выполнены правильно, и вы должны использовать Java Работа API сжатия .util.zip, если вы читаете файлы в сжатом файле (в Java эти встроенные файлы называются «записями», а именно каталогами, файлами), вам нужно распаковать его и судить. [/цвет]

[color = red] В веб-приложениях мы часто используем ServletContext прямо или косвенно для поиска ресурсов.В соответствии с семантикой сервлета ресурсы позиционирования должны находиться под webroot. [/цвет]

getResourcePaths Входящий путь должен начинаться с “/” и возвращаться относительно веб-корня или /WEB-INF/lib/xxx.jar/META-INF/resources

Все подчиненные каталоги или файлы:

For example, for a web application containing:

/welcome.html

/catalog/index.html

/catalog/products.html

/catalog/offers/books.html

/catalog/offers/music.html

/customer/login.jsp

/WEB-INF/web.xml

/WEB-INF/classes/com.acme.OrderServlet.class

/WEB-INF/lib/catalog.jar!/META-INF/resources/catalog/moreOffers/books.html

getResourcePaths(“/”) would return {“/welcome.html”, “/catalog/”, “/customer/”, “/WEB-INF/”}, and

getResourcePaths(“/catalog/”) would return {“/catalog/index.html”, “/catalog/products.html”, “/catalog/offers/”, “/catalog/moreOffers/”}.

getResource возвращает один URL-адрес пути, метод поиска такой же, как указано выше, сначала выполните поиск в корневом веб-каталоге, а затем найдите /WEB-INF/lib/xxx.jar/META-INF/resource

getResourceAsStream реализует прокси для getResource, а затем возвращает url.openStream

[color = red] Поиск ресурсов на основе экземпляров java.lang.Class [/ color]

getResource возвращает один URL. Если имя начинается с «/», агент даст Classloader часть после «/», в противном случае это будет имя пакета текущего класса (замените «.» На «/») + name

getResourceAsStream proxy url.openStream

[color = red] Поиск на основе ресурсов ClassLoader [/ color]

Classloader имеет отношения родитель-потомок. GetResource или getResources использует механизм делегирования для поиска родительским Classloader. Если он не может найти findResource (s).

getResource находит ресурс с заданным именем и возвращает один URL

getResources находит все ресурсы с заданным именем и возвращает список URL

getResourceAsStream proxy url.openStream, возвращает входной поток, который читает указанный ресурс

findResources реализуется подклассами

getSystemResource и getSystemResourceAsStream являются статическими методами, которые загружаются загрузчиком системного класса.

Прежде чем использовать ClassLoader для загрузки класса, вы должны найти файл класса, так же, как файл ресурса похож на рисунок. Если это местоположение выражается с помощью java.io.File, то есть оно относится к локальному системному файлу, а файл исполнения класса, загруженный вложенным апплетом, может находиться в любом месте сети до тех пор, пока он может быть загружен, независимо от того, что, просто используйте экземпляр File, Этого недостаточно для реализации ClassLoader, и он должен поддерживать различные представления пути. URL “Людям нравится их имя”

«Единое расположение ресурса», JVM будет использовать java.net.URL для выражения пути к ресурсу и использовать URLClassLoader для поиска класса или ресурса.

JVM использует механизм делегирования для поиска файлов классов или ресурсов, из которых хорошо известны AppClassLoader и ExtClassLoader, и они оба поддерживают ресурсы URL. Например, AppClassLoader указывает, что все файлы в java.class.path преобразуются в URL-адреса, например

D: velopTools workspace ims build classes; D: velopTools workspace ims lib extreme extremecomponents-1.0.4.jar; будет преобразован в

URL url1 = new URL(“file”,””,”D:developToolsworkspaceimsbuildclasses”);

URL url2 = new URL((“file”,”D:developToolsworkspaceimslibextremeextremecomponents-1.0.4.jar”,”);

URL[] urls = new URL[]{url1,url2};

ExtClassLoader указывает все файлы в java.ext.dirs, метод обработки такой же, как и в AppClassLoader, и в конечном итоге эти URL-адреса будут храниться в массиве URL-адресов для использования sun.misc.URLclasspath.

Каждый URLClassLoader предоставляет соответствующий URL-адрес для URLclasspath. Когда поиск ресурсов в URLClassLoader обрабатывается URLclasspath, он, наконец, реализуется в методах getResource (s) и findResource URLclasspath. Метод поиска ресурсов выполняет поиск ресурсов в каждом URL-адресе, который является специфическим для URL-адреса.

URL, оканчивающиеся на “/”, считаются каталогом:

Если в URL-адресе указано, что ресурс расположен в локальной системе, используйте экземпляр java.io.File, например, новый файл (url, ресурс), и верните URL-адрес ресурса, определив существование.

В противном случае используйте экземпляр URL, такой как новый URL (url, resource), и верните resourceURL, чтобы определить существование через url.connect. В то же время, если этот URL является URL-адресом jar, необходимо использовать правильный формат URL-адреса jar: jar: *****. Jar! / хххх

В противном случае он считается файлом JAR, а затем для загрузки используется специальный загрузчик JarLoader, этот JarLoader полностью использует «индекс» для ускорения загрузки.

Индекс JAR

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

Начиная с JDK 1.3, формат файла JAR поддерживает индексирование для оптимизации процесса поиска классов в веб-приложениях, особенно в апплетах. Механизм JarIndex собирает содержимое всех файлов JAR, определенных в апплете или приложении, и сохраняет эту информацию в файле индекса в первом файле JAR. После загрузки первого файла JAR загрузчик класса апплета будет использовать собранную информацию о содержимом для эффективной загрузки файла JAR (приведенный выше «индекс JAR» взят из http://www.ibm.com/developerworks/cn/java/j- jar / глава JAR)

Реализация индекса JAR зависит от мета-индекса и индекса-списка. Когда ExtClassLoader инициализируется, отношение сопоставления между файлом jar и файлом класса или ресурса будет установлено через файл мета-индекса; при загрузке класса или ресурса по мере необходимости,

Найдите это отношение в соответствии с текущим URL-адресом JAR. Если JAR был объявлен в мета-индексе, но класс или ресурс, указанный в файле, не соответствуют текущему поиску, то поиск JAR завершается, JarLoader текущего JAR инициализируется в соответствии с INDEX. LIST устанавливает отношение сопоставления. JAR, которому принадлежит этот файл, принадлежит «основному» JAR. По сравнению с «основным» JAR другие JAR, описанные в файле, являются «подчиненными» JAR. Когда соответствующий ресурс не может быть найден в «основном» JAR Он будет искать JAR «Vice» по очереди, и, если в JAR «Vice» есть файл INDEX.LIST, то установить отношения «Master and Vice» с другими JAR на основе текущего файла. Это отношение будет рекурсивным в соответствии с INDEX.LIST перед поиском ресурсов. настроить. Когда файл INDEX.LIST включен в JAR, а мета-индекс не указывает META-INF / INDEX.LIST, INDEX.LIST в этом случае считается недействительным.

meta-index

ExtClassLoader делает еще одну вещь, чем AppClassLoader, снимок экрана каталога расширений, указанного в java.ext.dirs

[img]http://dl2.iteye.com/upload/attachment/0084/7572/9eb191c8-e8f6-3e52-980d-b5ce065ead78.jpg[/img]

Хорошо видно, что существует файл мета-индекса, содержимое которого выглядит следующим образом:

[b][i]% VERSION 2

% WARNING: this file is auto-generated; do not edit

% UNSUPPORTED: this file and its format may change and/or

% may be removed in a future release

# dnsns.jar

META-INF/services/sun.net.spi.nameservice.NameServiceDescriptor

sun/net

# localedata.jar

sun/text

sun/util

# sunjce_provider.jar

com/sun/crypto/

META-INF/JCE_RSA.RSA

META-INF/JCE_RSA.SF

# sunmscapi.jar

sun/security

META-INF/JCE_RSA.RSA

META-INF/JCE_RSA.SF

# sunpkcs11.jar

sun/security

META-INF/JCE_RSA.RSA

META-INF/JCE_RSA.SF[/i][/b]

Написать файл мета-индекса

[list]

[*] Первая строка должна начинаться с% VERSION 2,

[*] Ссылочный пакет jar относится к каталогу, в котором находится мета-индекс

[*] Строки, ссылающиеся на Jar, должны начинаться с символа #! @, За которым следует «пробел»

[*] Файл, указанный в следующих нескольких строках фляги, начинающейся с! Должен быть файлом класса

[/list]

Эти упомянутые JAR-пакеты будут добавлены в массив URL-адресов ExtClassloader, и для этих JAR-пакетов будет создан «индекс» на основе содержимого мета-индекса. , Считается “не найден” и возвращает NULL;

Создать JarIndex

Вы можете создать JarIndex, указав опцию -i в команде jar. Первый JAR в командной строке является «основным».

[img]http://dl2.iteye.com/upload/attachment/0084/8186/168fe8d4-dbad-32ba-885c-7702c08dc2c4.jpg[/img]

Новый файл INDEX.LIST был добавлен в «основной» JAR

[i][b]JarIndex-Version: 1.0

dnsns.jar

sun

sun/net

sun/net/spi

sun/net/spi/nameservice

sun/net/spi/nameservice/dns

META-INF/services

sunjce_provider.jar

META-INF

com

com/sun

com/sun/crypto

com/sun/crypto/provider

sunpkcs11.jar

META-INF

sun/security/pkcs11

sun/security/pkcs11/wrapper

sunmscapi.jar

META-INF

sun

sun/security

sun/security/mscapi

localedata.jar

sun

sun/text

sun/text/resources

sun/util

sun/util/resources[/b][/i]

Загрузчик JarLoader полностью использует механизм индексации Jar. Если указанный URL заканчивается символом “/”, будет использован механизм загрузчика, рассмотренный ранее. В настоящее время механизм индексации Jar недопустим. “Например, xxx.jar /. В то же время, если не удается найти отношение сопоставления между meta-index и index.list, JarLoader добавляет путь URL-адреса Class-Path, указанный в manifest.mf файла jar, в путь поиска.

Особый случай: когда args пуст или “.”, Соответствующая запись не будет найдена и возвращается NULL

API доступа к ресурсам предоставляется в Spring.

public interface Resource extends InputStreamSource {

boolean exists();

boolean isOpen();

URL getURL() throws IOException;

File getFile() throws IOException;

Resource createRelative(String relativePath) throws IOException;

String getFilename();

String getDescription();

}

ClassPathResource, UrlResource, FileSystemResource, ServletContextResource и т. Д. Все реализованы. Интерфейс ResourceLoader вернет один экземпляр ресурса в соответствии со следующими условиями

[/size]

public interface ResourceLoader {
Resource getResource(String location);
}

public interface ResourcePatternResolver extends ResourceLoader{
String CLASSPATH_ALL_URL_PREFIX = "classpath*:";
Resource[] getResources(String locationPattern) throws IOException;
}

[size = medium] Spring предоставляет реализацию интерфейса DefaultResourceLoader по умолчанию:

location начинается с “classpath:”, затем используется ClassPathResource или его подэкземпляр

location – стандартный URL, используется UrlResource, JAR-путь не поддерживается

В противном случае, вернуть разные экземпляры в соответствии с конкретной реализацией ApplicationContext (подкласс ResourceLoader)

ClassPathXmlApplicationContext возвращает ClassPathResource или его подэкземпляры

FileSystemXmlApplicationContext возвращает FileSystemResource

WebApplicationContext возвращает ServletContextResource

Он также предоставляет поддержку подстановочных знаков в стиле ANT, такую ​​как classpath *: META-INF / * – context.xml, который реализуется PathMatchingResourcePatternResolver:

1. Если есть «classpath *:», все соответствующие ресурсы будут возвращены, если он содержит подстановочный знак ANT

2. При использовании «classpath *:» без подстановочного знака ANT proxy classloader.getResources возвращает несколько ресурсов

3. Без «classpath *:», с подстановочным знаком ANT, вернуть все соответствующие ресурсы

4. Без «classpath *:», без подстановочного знака ANT агент DefaultResourceLoader.getResource возвращает один ресурс [/ size]

[img]http://dl2.iteye.com/upload/attachment/0086/4623/ac7738a0-0aaa-3362-8ca6-bd1bd1a85fdb.jpg[/img]

[img]http://dl2.iteye.com/upload/attachment/0086/4625/0f9926db-7511-3036-9c5d-aa21add05231.jpg[/img]

Добавить комментарий