Что такое URI, URL, URN и чем они различаются. Чем хороши относительные ссылки и как их можно получить

Оборудование 20.11.2020
Оборудование

В последнее время неоднократно всплывает тема загрузки ресурсов. Вкратце: «Я загружаю картинку из c:\work\image.gif, а когда запускаю программу из jar-файла/на другом компьютере – она не грузится. Что делать?».

Между тем, ничего сложного тут нет. Надо только понимать принципы.

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

Второй вариант, который я часто вижу, – загрузка ресурса из jar-файла. Но тут очень часто делается одна ошибка – ресурс пытаются грузить через класс java.io.File . При том, что этот класс предназначен только для работы с файловыми системами.

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

Для загрузки ресурса служат методы java.lang.Class.getResource(String) , java.lang.Class.getResourceAsStream(Stri ng) , java.lang.ClassLoader.getResource(String) и java.lang.ClassLoader.getResourceAsStrea m(String) . Методы Class -а делегируют вызовы ClassLoader -у.

GetResource(String) по имени ресурса возвращает java.net.URL , через который можно получить этот ресурс. getResourceAsStream(String) , как нетрудно догадаться, возвращает java.io.InputStream , через который ресурс можно прочитать.

Имя ресурса представляет собой путь к ресурсу. Есть одна существенная тонкость, а именно – как оно интерпретируется.

Имя может быть абсолютным и относительным. Внешнее отличие – абсолютное имя начинается с символа "/". В первом случае ресурс ищется относительно корня classpath. Т.е. берутся все пути и jar-файлы, входящие в classpath, и ресурс ищется относительно совокупности этих точек. Если же имя относительное – к нему в начало приписывается путь, полученный из пакета текущего класса. Далее поиск ведется как в случае абсолютного имени.

Проще это понять на примерах. Пусть у нас задан classpath: c:\work\myproject\classes;c:\lib\lib.jar . Код примера находится в классе ru.skipy.test.ResourceLoadingTest .

Пример 1 . Мы используем конструкцию getClass().getResource("/images/logo.png") . Поскольку имя начинается с символа "/" – оно считается абсолютным. Поиск ресурса происходит следующим образом:


  1. К пути из classpath c:\work\myproject\classes приписывается имя ресурса /images/logo.png , в результате чего ищется файл c:\work\myproject\classes\images\logo.pn g . Если файл найден – поиск прекращается. Иначе:
  2. В jar-файле c:\lib\lib.jar ищется файл /images/logo.png , причем поиск ведется от корня jar-файла.
Пример 2 . Мы используем конструкцию getClass().getResource("res/data.txt") . Поскольку имя не начинается с символа "/" – оно считается относительным. Поиск ресурса происходит следующим образом:

  1. К пути из classpath c:\work\myproject\classes приписывается текущий пакет класса, где находится код, – /ru/skipy/test , – и далее имя ресурса res/data.txt , в результате чего ищется файл c:\work\myproject\classes\ru\skipy\test\r es\data.txt . Если файл найден – поиск прекращается. Иначе:
  2. В jar-файле c:\lib\lib.jar ищется файл /ru/skipy/test/res/data.txt (имя пакета текущего класса плюс имя ресурса), причем поиск ведется от корня jar-файла.
Ну и для того, чтобы ресурс был найден, необходимо обеспечить его существование. Т.е. при сборке приложения (упаковке его в jar-файл) позаботиться о том, чтобы ресурс тоже попал куда надо. Как это сделать – зависит от технологии сборки, многие IDE умеют копировать ресурсы при сборке в ту же точку, куда кладут и скомпилированные классы. При использовании ant это надо предусмотреть в явном виде.

Вот тут можно скачать полностью рабочий пример, иллюстрирующий оба типа загрузки: . Ресурсы – изображение и текст – располагаются в отдельной директории, при сборке попадают в jar-файл и грузятся один по абсолютному, другой по относительному имени. Пример собирается и запускается через ant , командой ant run он запускается из директории сборки build/classes/ , командой ant run-jar – из собранного jar-файла.

Вот, где-то так. Вопросы? Комментарии?

В классе ResourceBundle.Control существует набор внешних методов, вызываемых методом ResourceBundle.getBundle() во время поиска и загрузки наборов. Создав свой класс Control , вы можете изменить поведение по-умолчанию для загрузки и кеширования.

В данном случае вам необходимо создать реализацию двух методов класса Control: getFormats() и newBundle() . Метод getFormats() отвечает за поддержку формата XML, а newBundle() работает с набором ресурсов. В базовом классе Control существуют вспомогательные методы, предназначенные для преобразования основных имен наборов в действительные имена ресурсов.

В данную реализацию класса ResourceBundle.Control включен подкласс XMLResourceBundle . Данный подкласс используется для загрузки данных из XML файла и использовании их в методе ResourceBundle .

Ниже приводится описание класса Control и реализация метода ResourceBundle:

import java.io.*;
import java.net.*;
import java.util.*;

Public class XMLResourceBundleControl extends ResourceBundle.Control {
private static String XML = "xml" ;

Public List getFormats (String baseName ) {
return Collections.singletonList (XML ) ;
}

Public ResourceBundle newBundle (String baseName, Locale locale,
String format, ClassLoader loader,
boolean reload )
throws IllegalAccessException, InstantiationException, IOException {
if ((baseName == null ) || (locale == null ) || (format == null )
|| (loader == null )) {
throw new NullPointerException () ;
}
ResourceBundle bundle = null ;
if (format.equals (XML )) {
String bundleName = toBundleName (baseName, locale ) ;
String resourceName = toResourceName
(bundleName, format ) ;
URL url = loader.getResource
(resourceName ) ;
if (url != null ) {
URLConnection connection = url.openConnection () ;
if (connection != null ) {
if (reload ) {
connection.setUseCaches (false ) ;
}
InputStream stream = connection.getInputStream () ;
if (stream != null ) {
BufferedInputStream bis = new BufferedInputStream (
stream ) ;
bundle = new XMLResourceBundle (bis ) ;
bis.close () ;
}
}
}
}
return bundle;
}

Private static class XMLResourceBundle extends ResourceBundle {
private Properties props;

XMLResourceBundle (InputStream stream ) throws IOException {
props = new Properties () ;
props.loadFromXML (stream ) ;
}

Protected Object handleGetObject (String key ) {
return props.getProperty (key ) ;
}

Public Enumeration getKeys () {
Set handleKeys = props.stringPropertyNames () ;
return Collections.enumeration (handleKeys ) ;
}
}

Public static void main (String args ) {
("Test2" ,
new XMLResourceBundleControl ()) ;
String string = bundle.getString
("HelpKey" ) ;
System.out.println ("HelpKey: " + string ) ;
}
}

В данную реализацию включена тестовая программа из трех строчек:

ResourceBundle bundle = ResourceBundle.getBundle ("Test2" , new XMLResourceBundleControl ()) ;
String string = bundle.getString
("HelpKey" ) ;
System.out.println ("HelpKey: " + string ) ;

Наибольший интерес здесь представляет первая строка. Вам необходимо передать ваш элемент Control методу getBundle() . После этого вы можете использовать набор, как и в любом другом случае.

Ниже преводится пример XML файла Test2.xml:

http://java.sun.com/dtd/properties.dtd " > OK Cancel Help Yes No

Результатом выполнения программы XMLResourceBundleControl будет:

> java XMLResourceBundleControl HelpKey: Help

В приведенной реализации не используются методы getTimeToLive() и needsReload() :

public long getTimeToLive (String baseName, Locale locale )

Public boolean needsReload (String baseName,
Locale locale,
String format,
ClassLoader loader,
ResourceBundle bundle,
long loadTime )

Метод getTimeToLive() возвращает время жизни для наборов ресурсов, созданных при помощи ResourceBundle.Control . Наборы ресурсов сохраняются в кеше для убыстрения процесса повторной загрузки. Таким образом, при повторной загрузке набора, он будет находиться в кеше. Положительное значение времени жизни затает в милисекундах продолжительность сохранения набора в кеше без повторной проверки. По-умолчанию значением, возвращаемым методом getTimeToLive() является TTL_NO_EXPIRATION_CONTROL , отключающее проверку истечения времени хранения в кеше. Если вы не хотите кешировать набор, то верните значение TTL_DONT_CACHE . Если возвращается значение 0, то набор кешируется, но при каждом вызове метода getBundle() происходит его проверка. Для очистки кеша вызовите статичный метод clearCache() класса ResourceBundle . В нем есть не обязательный аргумент ClassLoader , позволяющий очищать кеши, созданные определенным загрузчиком.

Метод needsReload() определяет необходимость перезагрузки кешированного набора. Значение true означает, что набор необходимо перезагрузить, а false , что не его перезагружать не надо. Вы можете контролировать необходимость перезагрузки набора ресурсов при помощи перегрузки метода needsReload() . Например, если вы хотите, чтобы набор ресурсов всегда перезагружался, метод needsReload() должен всегда возвращать значние true . В этом случае метод getTimeToLive() должен возвращать всегда значение 0. Иначе набор будет сохраняться дольше, чем положено.

Для получения дополнительной информации об улучшениях, связанных с процессами интернационализации в Mustang, вы можете обратиться к блогу Джона Оконера, разработчика програмнного обеспечения фирмы Sun, по адресу

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

Физические ресурсы

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

Здоровое питание . Существуют полезные и вредные для здоровья продукты. Использование в рационе вредной еды провоцирует множество заболеваний: ожирение, инфаркты и инсульты из-за повышенного содержания холестерина в крови и т.п. Следует минимизировать, а лучше исключить из рациона такие вещества как соль, сахар, острое, жирное, жареное и т.п. Существует множество методик здорового питания, но ими пользуется крайне мало людей.

Отказ от вредных привычек . Курение, алкоголь и т.п. также создают проблемы со здоровьем: рак легких, цирроз печени, инфаркт и т.п. Для обеспечения отличного здоровья и долголетия нужно отказаться от этих привычек.

Отдых . Выполнение работы долгое время (по 12-14 часов в сутки) приводит к переутомлению, стрессу , срывам и психическим заболеваниям. Нагружая организм продолжительное время, появляются заболевания суставов и мышц: артроз, артрит и т.п. Для избегания подобных проблем требуется регулярный отдых. Как минимум нужно спать не 3-5 часов в сутки, а полноценных 8. Отдых делиться на пассивный и активный. Пассивный отдых (полежать на диване, посмотреть телевизор, почитать книгу..) позволяет восстановить физические силы. Активный же отдых (спорт, хобби, прогулки, путешествия...) позволяет восстановиться эмоционально. Можно применять следующий принцип : лучший отдых от работы - это выполнение другой работы. Переключайтесь между работами с разными нагрузками, например, походив несколько часов по разным офисам, можно несколько часов посидеть за своим столом и выполнить бумажную работу, разобрать почту, составить отчеты и т.п.

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

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

Духовные ресурсы

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

Интеллектуальные ресурсы

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

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

Финансовые ресурсы

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

Для развития финансовых ресурсов необходимо постоянно повышать доходы и капитал и понижать расходы. Разницу между доходами и расходами всегда необходимо вкладывать для увеличения доходов: "капитал должен приносить капитал". Как минимум следует начать с откладывания процента от доходов на банковский вклад. Генерируйте идеи для организации нового бизнеса и повышения доходности инвестиций. В этом поможет мощный сервис Бесплатный онлайн органайзер, ежедневник, планировщик дел и задач, календарь - Личные цели .

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

Социальные ресурсы

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

Например, есть автослесарь и электрик. Если у первого сломается телевизор, а у второго - автомобиль, они могут помочь друг другу и первый отремонтирует автомобиль, а второй - телевизор, естественно, на взаимовыгодных условиях.

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

Научитесь делать первый шаг к достижению успеха
с помощью тренинга
Тренинг уверенности в себе

Научитесь придумывать способы развития личных ресурсов
с помощью тренинга

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

Сначала немного определений:

Html (от английского "HyperText Markup Language" - язык разметки гипертекста) - это стандартный язык разметки веб-страниц.

Css (от английского "Cascading Style Sheets" - каскадные таблицы стилей) - это технология описания внешнего вида веб-страницы.

Без знания html и css вести свой сайт будет очень проблематично - даже счетчик статистики или тот же баннер поставить не получится. Не бегать же за помощью к специалистам или создавать тему за темой на форумах? Нужно просто взять и выучить.

По своему опыту могу сказать, что html и css можно выучить за 1 месяц. Конечно, я не говорю о профессиональных высотах - вы до них сами доберетесь при желании.

На мой взгляд, лучший способ выучить html, css, да и другие тематики, включая продвижение сайтов - это завести свой сайт и на нем практиковаться. Кстати, можете посмотреть первый созданный мною сайт по картам для игры Counter-Strike , созданием которых я тогда увлекался. Вот карты и их скрины , созданные стариком Глобатором в те времена, когда он еще не знал, что такое топ-10, тИЦ и PR, и беззаботно резвился на солнышке создавал трехмерные карты 🙂 . Я создал этот сайт за месяц, изучая html и css на практике.

Для того, чтобы выучить html и css, совсем необязательно быть техническим специалистом. К примеру, я вообще гуманитарий и по математике у меня в основном было "2" 🙂 . Так что выучить html и css под силу любому желающему. Перечисленные мною ресурсы подойдут также и для того, чтобы в любой момент вы могли с их помощью выяснить какой-либо интересующий вас момент по html и css.

Сайты для изучения html и css

Начну подборку полезных ресурсов для изучения html и css с сайта, по которому я сам занимался. Это Дикие уроки html , которые написала Валентина Ахметзянова ака Дикарка . Она настолько весело и интересно описала все необходимые моменты, что изучение html и css с помощью ее уроков превращается в увлекательное занятие. Кстати, можете почитать для блога сайт. Диких уроков вполне достаточно, чтобы выучить html и css на необходимом для работы вебмастером уровне.

Представляете, кем бы я был, если бы развивался дальше в теме Фотошопа? Я бы был настоящим монстром! Но я связался с SEO и прозябаю тут, набирая эти буквы скрюченными от мороза пальцами 🙂 . Да шучу, тут тоже тепло и неплохо кормят 🙂 .

Консорциум Всемирной паутины (World Wide Web Consortium, W3C) рекомендовал технологию CSS (Cascading Style Sheets) в 1996 году. С тех пор веб-разработчики используют каскадные таблицы стилей для создания уникального оформления сайтов.

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

Установите расширение Web Developer для Chrome или дополнение Disable CSS для Firefox, чтобы полюбоваться любимыми сайтами без каскадных таблиц стилей.

Изменения будут разительными, хотя и не всегда. Например, новостной агрегатор Drudge Report почти не изменится: он прост как дважды два. Тем не менее ежемесячно ресурс просматривают свыше 150 миллионов раз.

Где научиться тонкостям CSS

Будем последовательны и начнём с крепкой теоретической базы. За ней обратимся к Владу Мержевичу, автору книг и веб-разработчику, который поддерживает несколько качественных ресурсов о вёрстке и стилизации веб-страниц.

На вы найдёте понятный самоучитель и ответы на популярные вопросы о каскадных таблицах стилей. Здесь же представлены обучающие статьи об актуальной третьей спецификации CSS.

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

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

Обучение - дело долгое и порой скучное. Неплохо бы найти мотивацию, чтобы она помогала в трудные минуты. Вдохновляться будем у других веб-дизайнеров, а точнее на сайте . Здесь каждый день представляют качественный проект, который служит образцом того, к чему стоит стремиться. Многие из победителей действительно удивляют. Не забывайте заглядывать и голосовать за понравившихся номинантов.

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

Загрузите эталонный HTML, добавьте своё оформление и отправьте всё это обратно. Возможно, ваш подход окажется самым лучшим. К слову, можно скачать чужой вариант и посмотреть, как же он реализован.

Понятное дело, что вам захочется применить нечто эдакое, что привлечёт всеобщее внимание. Не знаем, есть ли такое на , но десятки и сотни любопытных приёмов там точно завалялись.

Скачать код напрямую не получится. Вам придётся залезть в меню разработчиков - такова политика местной партии. При этом подавляющее большинство CSS-стилей можно использовать без разрешения автора.

Зачем нам чужое, если у самих руки прямо растут? Так ли оно на самом деле покажет . Помимо базовой проверки синтаксиса CSS, веб-сервис выполняет проверку на соответствие правилам, которые влияют на скорость загрузки страниц. На выходе получаем хороший, милый для браузеров CSS-код.

А какие ресурсы о каскадных таблицах стилей можете посоветовать вы?

Рекомендуем почитать

Наверх