Класс URI

Все реализованные интерфейсы:
Serializable, Comparable<URI>
public final class URI
extends Object
implements Comparable<URI>, Serializable

Представляет ссылку на универсальный идентификатор ресурса (URI).

Помимо некоторых незначительных отклонений, указанных ниже, экземпляр этого класса представляет ссылку URI, как определено в RFC 2396: Универсальные идентификаторы ресурсов (URI): Общий синтаксис, с изменениями, внесёнными в RFC 2732: Формат литеральных адресов IPv6 в URL. Формат литеральных адресов IPv6 также поддерживает scope_id. Синтаксис и использование scope_id описано здесь. Этот класс предоставляет конструкторы для создания экземпляров URI из их компонентов или путём разбора их строковых форм, методы для доступа к различным компонентам экземпляра, а также методы для нормализации, разрешения и относительного преобразования экземпляров URI. Экземпляры этого класса неизменяемы.

Синтаксис и компоненты URI

На высшем уровне ссылка URI (далее просто "URI") в строковом виде имеет синтаксис
[схема:]часть_схемы[#фрагмент]
где квадратные скобки [...] обозначают необязательные компоненты, а символы : и # имеют своё значение.

Абсолютный URI указывает схему; URI, который не является абсолютным, называется относительным. URI также классифицируются по тому, являются ли они непрозрачными или иерархическими.

Непрозрачный URI — это абсолютный URI, схема-специфическая часть которого не начинается с символа косой черты ('/'). Непрозрачные URI не подвергаются дальнейшему разбору. Некоторые примеры непрозрачных URI:

  • mailto:java-net@java.sun.com
  • news:comp.lang.java
  • urn:isbn:096139210x

Иерархический URI — это либо абсолютный URI, схема-специфическая часть которого начинается с символа косой черты, либо относительный URI, то есть URI, который не указывает схему. Некоторые примеры иерархических URI:

http://example.com/languages/java/ sample/a/index.html#28 ../../demo/b/index.html file:///~/calendar

Иерархический URI подвергается дальнейшему разбору в соответствии с синтаксисом

[схема:][//авторитет][путь][?запрос][#фрагмент]
где символы :, /, ? и # имеют своё значение. Часть URI, специфичная для схемы иерархического URI, состоит из символов между компонентами схемы и фрагмента.

Компонент авторитета иерархического URI, если он указан, является либо серверным, либо регистровым. Серверный авторитет анализируется по знакомому синтаксису

[информация_пользователя@]хост[:порт]
где символы @ и : имеют своё значение. Почти все схемы URI, используемые в настоящее время, являются серверными. Компонент авторитета, который не анализируется таким образом, считается регистровым.

Компонент пути иерархического URI называется абсолютным, если он начинается с символа косой черты ('/'); в противном случае он является относительным. Путь иерархического URI, который либо абсолютный, либо указывает авторитет, всегда абсолютный.

В целом, экземпляр URI имеет следующие девять компонентов:

Компонент Тип
схема String
часть_схемы String
авторитет String
информация_пользователя String
хост String
порт int
путь String
запрос String
фрагмент String
В данном экземпляре любой конкретный компонент либо неопределён, либо определён со значением. Неопределённые строковые компоненты представлены как null, а неопределённые целочисленные компоненты — как -1. Строковый компонент может быть определён со значением пустой строки; это не эквивалентно тому, что компонент является неопределённым.

Является ли определённым тот или иной компонент в экземпляре, зависит от типа представляемого URI. Абсолютный URI имеет компонент схемы. Непрозрачный URI имеет схему, часть, специфичную для схемы, и, возможно, фрагмент, но не имеет других компонентов. Иерархический URI всегда имеет путь (хотя он может быть пустым) и часть, специфичную для схемы (которая, по крайней мере, содержит путь), и может иметь любые другие компоненты. Если компонент авторитета присутствует и является серверным, то компонент хоста будет определён, а компоненты информации пользователя и порта могут быть определены.

Операции над экземплярами URI

Ключевыми операциями, поддерживаемыми этим классом, являются нормализация, разрешение и относительное преобразование.

Нормализация — это процесс удаления ненужных "." и ".." сегментов из компонента пути иерархического URI. Каждый "." сегмент просто удаляется. ".." сегмент удаляется только в том случае, если ему предшествует не-".." сегмент. Нормализация не влияет на непрозрачные URI.

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

sample/a/index.html#28 (1)
относительно базового URI http://example.com/languages/java/ — это результирующий URI
http://example.com/languages/java/sample/a/index.html#28
Разрешение относительного URI
../../demo/b/index.html (2)
относительно этого результата, в свою очередь, даёт
http://example.com/languages/java/demo/b/index.html
Поддерживается разрешение как абсолютных, так и относительных URI, а также абсолютных и относительных путей в случае иерархических URI. Разрешение URI file:///~calendar относительно любого другого URI просто возвращает исходный URI, поскольку он является абсолютным. Разрешение относительного URI (2) выше относительно относительного базового URI (1) даёт нормализованный, но по-прежнему относительный, URI
demo/b/index.html

Относительное преобразование, наконец, является обратной операцией к разрешению: Для любых двух нормализованных URI u и v,

u.relativize(u.resolve(v)).equals(v) and u.resolve(u.relativize(v)).equals(v) .
Эта операция часто полезна при создании документа, содержащего URI, которые необходимо сделать относительными к базовому URI документа по возможности. Например, относительное преобразование URI
http://example.com/languages/java/sample/a/index.html#28
относительно базового URI
http://example.com/languages/java/
даёт относительный URI sample/a/index.html#28.

Категории символов

RFC 2396 точно определяет, какие символы разрешены в различных компонентах ссылки URI. Ниже используются следующие категории, большинство из которых взяты из этого спецификации, для описания этих ограничений:
Категория Описание
alpha Символы US-ASCII алфавита, 'A' по 'Z' и 'a' по 'z'
digit Символы US-ASCII десятичных цифр, '0' по '9'
alphanum Все символы alpha и digit
unreserved Все символы alphanum вместе с теми, что находятся в строке "_-!.~'()*"
punct Символы в строке ",;:$&+="
reserved Все символы punct вместе с теми, что находятся в строке "?/[]@"
escaped Экранированные октеты, то есть тройки, состоящие из символа процента ('%') и двух шестнадцатеричных цифр ('0'-'9', 'A'-'F', и 'a'-'f'
other Символы Unicode, которые не входят в набор символов US-ASCII, не являются управляющими символами (согласно методу Character.isISOControl) и не являются пробельными символами (согласно методу Character.isSpaceChar) (Отклонение от RFC 2396, который ограничен US-ASCII)

Набор всех допустимых символов URI состоит из unreserved, reserved, escaped и other символов.

Экранированные октеты, цитирование, кодирование и декодирование

RFC 2396 позволяет экранированным октетам появляться в компонентах информации пользователя, пути, запроса и фрагмента. Экранирование служит двум целям в URI:
  • Для кодирования символов, не являющихся символами US-ASCII, когда URI должен строго соответствовать RFC 2396, не содержа ни каких other символов.

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

Эти цели достигаются в этом классе тремя связанными операциями:
  • Символ кодируется путём замены его последовательностью экранированных октетов, представляющих этот символ в наборе символов UTF-8. Например, символ евро (€) кодируется как "%E2%82%AC". (Отклонение от RFC 2396, который не указывает какой-либо конкретный набор символов.)

  • Недопустимый символ цитируется путём его кодирования. Например, пробел цитируется путём замены его на "%20". UTF-8 содержит US-ASCII, поэтому для символов US-ASCII это преобразование имеет точно такой же эффект, как и требуется в RFC 2396.

  • Последовательность экранированных октетов декодируется путём замены её последовательностью символов, которые она представляет в наборе символов UTF-8. UTF-8 содержит US-ASCII, поэтому декодирование имеет эффект снятия цитирования любого цитированного символа US-ASCII, а также декодирования любого закодированного символа, не являющегося символом US-ASCII. Если при декодировании экранированных октетов возникает ошибка декодирования, то ошибочные октеты заменяются на '\uFFFD', символ замены Unicode.

Эти операции представлены в конструкторах и методах этого класса следующим образом:
  • Конструктор с одним аргументом требует, чтобы все недопустимые символы в своём аргументе были заключены в кавычки, и сохраняет все экранированные октеты и другие символы, которые присутствуют.

  • Конструкторы с несколькими аргументами заключают недопустимые символы в кавычки, как требуется компонентами, в которых они появляются. Символ процента ('%') всегда заключается в кавычки этими конструкторами. Любые другие символы сохраняются.

  • Методы getRawUserInfo, getRawPath, getRawQuery, getRawFragment, getRawAuthority и getRawSchemeSpecificPart возвращают значения соответствующих компонентов в сыром виде, без интерпретации каких-либо экранированных октетов. Строки, возвращаемые этими методами, могут содержать как экранированные октеты, так и другие символы, но не будут содержать недопустимые символы.

  • Методы getUserInfo, getPath, getQuery, getFragment, getAuthority и getSchemeSpecificPart декодируют все экранированные октеты в соответствующих компонентах. Возвращаемые этими методами строки могут содержать как другие символы, так и недопустимые символы, но не будут содержать экранированных октетов.

  • Метод toString возвращает строку URI со всеми необходимыми кавычками, но которая может содержать другие символы.

  • Метод toASCIIString возвращает полностью заключённую в кавычки и закодированную строку URI, которая не содержит никаких других символов.

Тождества

Для любого URI u, всегда выполняется
new URI(u.toString()).equals(u) .
. Для любого URI u, который не содержит избыточного синтаксиса, такого как две косые черты перед пустым авторитетом (как в file:///tmp/) или двоеточие после имени хоста, но без порта (как в http://java.sun.com:), и который не кодирует символы, кроме тех, которые должны быть заключены в кавычки, также выполняются следующие тождества:
new URI(u.getScheme(),
             u.getSchemeSpecificPart(),
             u.getFragment())
     .equals(u)
во всех случаях,
new URI(u.getScheme(),
             u.getAuthority(),
             u.getPath(), u.getQuery(),
             u.getFragment())
     .equals(u)
если u иерархический, и
new URI(u.getScheme(),
             u.getUserInfo(), u.getHost(), u.getPort(),
             u.getPath(), u.getQuery(),
             u.getFragment())
     .equals(u)
если u иерархический и не имеет авторитета или имеет авторитет на основе сервера.

URI, URL и URN

URI — это унифицированный идентификатор ресурса, а URL — это унифицированный локатор ресурса. Следовательно, любой URL является URI, в абстрактном смысле, но не каждый URI является URL. Это связано с тем, что есть еще одна подкатегория URI, унифицированные имена ресурсов (URN), которые называют ресурсы, но не указывают, как их найти. URI mailto, news, и isbn — примеры URN.

Понятийное различие между URI и URL отражается в различиях между этим классом и классом URL.

Экземпляр этого класса представляет URI-ссылку в синтаксическом смысле, определённом в RFC 2396. URI может быть абсолютным или относительным. Строка URI парсится в соответствии с общей синтаксической формой без учёта схемы, если таковая имеется. Не выполняется поиск хоста, если таковой имеется, и не создаётся обработчик потока, зависящий от схемы. Равенство, хэширование и сравнение определяются строго по содержанию символов экземпляра. Другими словами, URI-экземпляр — это не что иное, как структурированная строка, которая поддерживает синтаксические, независимые от схемы операции сравнения, нормализации, разрешения и релятивизации.

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

С момента:
1.4
См. также:
RFC 2279: UTF-8, формат преобразования ISO 10646,
RFC 2373: Архитектура адресации IPv6,
RFC 2396: Унифицированные идентификаторы ресурсов (URI): Общий синтаксис,
RFC 2732: Формат буквенных адресов IPv6 в URL,
URISyntaxException, Сериализованная форма

Конструкторы

Конструктор Описание
URI​(String str)

Создаёт URI путём парсинга заданной строки.

URI​(String scheme, String ssp, String fragment)

Создаёт URI из заданных компонентов.

URI​(String scheme, String userInfo, String host, int port, String path, String query, String fragment)

Создаёт иерархический URI из заданных компонентов.

URI​(String scheme, String host, String path, String fragment)

Создаёт иерархический URI из заданных компонентов.

URI​(String scheme, String authority, String path, String query, String fragment)

Создаёт иерархический URI из заданных компонентов.

Методы

Модификатор и тип Метод Описание
int compareTo​(URI that)

Сравнивает этот URI с другим объектом, который должен быть URI.

static URI create​(String str)

Создаёт URI путём парсинга заданной строки.

boolean equals​(Object ob)

Проверяет равенство этого URI с другим объектом.

String getAuthority()

Возвращает декодированный компонент авторитета этого URI.

String getFragment()

Возвращает декодированный компонент фрагмента этого URI.

String getHost()

Возвращает компонент хоста этого URI.

String getPath()

Возвращает декодированный компонент пути этого URI.

int getPort()

Возвращает номер порта этого URI.

String getQuery()

Возвращает декодированный компонент запроса этого URI.

String getRawAuthority()

Возвращает компонент авторитета этого URI в сыром виде.

String getRawFragment()

Возвращает компонент фрагмента этого URI в сыром виде.

String getRawPath()

Возвращает компонент пути этого URI в сыром виде.

String getRawQuery()

Возвращает компонент запроса этого URI в сыром виде.

String getRawSchemeSpecificPart()

Возвращает компонент схемы этого URI в сыром виде.

String getRawUserInfo()

Возвращает компонент информации пользователя этого URI в сыром виде.

String getScheme()

Возвращает компонент схемы этого URI.

String getSchemeSpecificPart()

Возвращает декодированный компонент схемы этого URI.

String getUserInfo()

Возвращает декодированный компонент информации пользователя этого URI.

int hashCode()

Возвращает значение хэш-кода для этого URI.

boolean isAbsolute()

Указывает, является ли данный URI абсолютным.

boolean isOpaque()

Указывает, является ли данный URI неиерархическим.

URI normalize()

Нормализует путь этого URI.

URI parseServerAuthority()

Попытка разобрать компонент авторитета этого URI (если он определён) на компоненты «информация пользователя», «хост» и «порт».

URI relativize​(URI uri)

Релятивизирует данный URI относительно этого URI.

URI resolve​(String str)

Создаёт новый URI путём парсинга заданной строки и её разрешения относительно этого URI.

URI resolve​(URI uri)

Разрешает данный URI относительно этого URI.

String toASCIIString()

Возвращает содержимое этого URI в виде строки US-ASCII.

String toString()

Возвращает содержимое этого URI в виде строки.

URL toURL()

Создаёт URL из этого URI.

Методы, объявленные в классе java.lang.Object

clone, finalize, getClass, notify, notifyAll, wait, wait, wait

Конструкторы

URI

public URI(String str)
    throws URISyntaxException

Создаёт URI, разобрав заданную строку.

Этот конструктор анализирует заданную строку точно так, как указано в грамматике в RFC 2396, Приложение А, за исключением следующих отличий:

  • Разрешено пустое поле authority, при условии, что за ним следует непустой путь, компонент запроса или фрагмент. Это позволяет анализировать URI, такие как "file:///foo/bar", что, по всей видимости, соответствует намерениям RFC 2396, хотя грамматика этого не допускает. Если компонент authority пуст, то компоненты user-information, host и port не определены.

  • Разрешены пустые относительные пути; это, по всей видимости, соответствует намерениям RFC 2396, хотя грамматика этого не допускает. Основное последствие этого отличия состоит в том, что автономный фрагмент, такой как "#foo", анализируется как относительный URI с пустым путём и заданным фрагментом и может быть полезно разрешён по отношению к базовому URI.

  • IPv4-адреса в компонентах host анализируются строго, как указано в RFC 2732: Каждый элемент адреса типа «точка с запятой» должен содержать не более трёх десятичных цифр. Каждый элемент также ограничен значением, не превышающим 255.

  • Имена хостов в компонентах host, состоящие только из одного доменного метки, разрешено начинать с символа alphanum. По всей видимости, это соответствует намерениям раздела 3.2.2 RFC 2396, хотя грамматика этого не допускает. Последствием этого отличия является то, что компонент authority иерархического URI, такого как s://123, будет анализироваться как authority на основе сервера.

  • IPv6-адреса разрешены для компонента host. IPv6-адрес должен быть заключён в квадратные скобки ('[' и ']') как указано в RFC 2732. Сам IPv6-адрес должен быть проанализирован в соответствии с RFC 2373. IPv6-адреса дополнительно ограничены описанием не более шестнадцати байтов информации об адресе, ограничение, подразумеваемое в RFC 2373, но не выразимое в грамматике.

  • Символы в категории other разрешены везде, где RFC 2396 разрешает escaped-октеты, то есть в компонентах user-information, path, query и fragment, а также в компоненте authority, если authority основана на реестре. Это позволяет URI содержать символы Unicode, выходящие за рамки набора символов US-ASCII.

Параметры:
str - Строка, которая должна быть обработана в URI
Исключения:
NullPointerException - Если str является null
URISyntaxException - Если заданная строка нарушает RFC 2396, как дополнено вышеуказанными отличиями

URI

public URI(String scheme,
           String userInfo,
           String host,
           int port,
           String path,
           String query,
           String fragment)
    throws URISyntaxException

Создаёт иерархический URI из заданных компонентов.

Если схема задана, то путь, если также задан, должен быть либо пустым, либо начинаться с символа косой черты ('/'). В противном случае компонент нового URI может остаться неопределённым, передав null для соответствующего параметра или, в случае параметра port, передав -1.

Этот конструктор сначала создаёт строку URI из заданных компонентов в соответствии с правилами, указанными в RFC 2396, пункт 5.2, шаг 7:

  1. Изначально строка результата пустая.

  2. Если задана схема, она добавляется к результату, за которой следует двоеточие (':').

  3. Если заданы данные пользователя, хост или порт, то добавляется строка "//".

  4. Если заданы данные пользователя, они добавляются, за которыми следует символ коммерческого знака «@» ('@'). Любой символ, не принадлежащий категориям unreserved, punct, escaped или other, подлежит кодированию.

  5. Если задан хост, он добавляется. Если хост является буквальным IPv6-адресом, но не заключён в квадратные скобки ('[' и ']'), то добавляются квадратные скобки.

  6. Если задан номер порта, добавляется двоеточие (':'), за которым следует номер порта в десятичной форме.

  7. Если задан путь, он добавляется. Любой символ, не принадлежащий категориям unreserved, punct, escaped или other, и не равный символу косой черты ('/') или символу коммерческого знака «@» ('@'), подлежит кодированию.

  8. Если задан запрос, добавляется знак вопроса ('?'), за которым следует запрос. Любой символ, не являющийся допустимым символом URI, подлежит кодированию.

  9. Наконец, если задан фрагмент, добавляется знак диеза ('#'). за которым следует фрагмент. Любой символ, не являющийся допустимым символом URI, подлежит кодированию.

Полученная строка URI затем анализируется так, как если бы вызывался конструктор URI(String), а затем вызывался метод parseServerAuthority() над результатом; это может привести к выбросу исключения URISyntaxException.

Параметры:
scheme - Имя схемы
userInfo - Имя пользователя и данные авторизации
host - Имя хоста
port - Номер порта
path - Путь
query - Запрос
fragment - Фрагмент
Исключения:
URISyntaxException - Если заданы как схема, так и путь, но путь является относительным, если строка URI, созданная из заданных компонентов, нарушает RFC 2396, или если компонент authority строки присутствует, но не может быть проанализирован как authority на основе сервера

URI

public URI(String scheme,
           String authority,
           String path,
           String query,
           String fragment)
    throws URISyntaxException

Создаёт иерархический URI из заданных компонентов.

Компонент может быть оставлен неопределённым, передав null.

Этот конструктор работает так, как если бы вызывался семиаргументный конструктор следующим образом:

new URI(scheme, null, host, -1, path, null, fragment);
Параметры:
scheme - Имя схемы
authority - Authority
path - Путь
query - Запрос
fragment - Фрагмент
Исключения:
URISyntaxException - Если заданы как схема, так и путь, но путь является относительным, если строка URI, созданная из заданных компонентов, нарушает RFC 2396, или если компонент authority строки присутствует, но не может быть проанализирован как authority на основе сервера

URI

public URI(String scheme,
           String host,
           String path,
           String fragment)
    throws URISyntaxException

Создаёт иерархический URI из заданных компонентов.

Компонент может быть оставлен неопределённым, передав null.

Этот конструктор работает так, как если бы вызывался семиаргументный конструктор следующим образом:

new URI(scheme, null, host, -1, path, null, fragment);
Параметры:
scheme - Имя схемы
host - Имя хоста
path - Путь
fragment - Фрагмент
Исключения:
URISyntaxException - Если строка URI, созданная из заданных компонентов, нарушает RFC 2396

URI

public URI(String scheme,
           String ssp,
           String fragment)
    throws URISyntaxException

Создаёт URI из заданных компонентов.

Компонент может быть оставлен неопределённым, передав null.

Этот конструктор сначала создаёт строку URI, используя заданные компоненты следующим образом:

  1. Изначально строка результата пустая.

  2. Если задана схема, она добавляется к результату, за которой следует двоеточие (':').

  3. Если задана часть схемы, она добавляется. Любой символ, не являющийся допустимым символом URI, подлежит кодированию.

  4. Наконец, если задан фрагмент, добавляется знак диеза ('#'). за которым следует фрагмент. Любой символ, не являющийся допустимым символом URI, подлежит кодированию.

Полученная строка URI затем анализируется, чтобы создать новый экземпляр URI, как если бы вызывался конструктор URI(String); это может привести к выбросу исключения URISyntaxException.

Параметры:
scheme - Имя схемы
ssp - Часть, специфичная для схемы
fragment - Фрагмент
Исключения:
URISyntaxException - Если строка URI, построенная из заданных компонентов, нарушает RFC 2396

Методы

create

public static URI create(String str)

Создаёт URI, разобрав заданную строку.

Этот удобный фабричный метод работает так, как будто он вызывает конструктор URI(String); любое исключение URISyntaxException, брошенное конструктором, перехватывается и оборачивается в новый объект IllegalArgumentException, который затем и выбрасывается.

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

Параметры:
str - Строка, которая должна быть обработана как URI
Возвращает:
Новый URI
Исключения:
NullPointerException - Если str является null
IllegalArgumentException - Если заданная строка нарушает RFC 2396

parseServerAuthority

public URI parseServerAuthority()
                         throws URISyntaxException

Попытка разобрать компонент «authority» этого URI, если он определён, на компоненты «user-information», «host» и «port».

Если компонент «authority» этого URI уже распознан как серверный, то он уже будет разобран на компоненты «user-information», «host» и «port». В этом случае, или если у этого URI нет компонента «authority», этот метод просто возвращает этот URI.

В противном случае этот метод пытается ещё раз разобрать компонент «authority» на компоненты «user-information», «host» и «port» и выбрасывает исключение, описывающее причину, по которой компонент «authority» не удалось разобрать таким образом.

Этот метод предоставляется потому, что общий синтаксис URI, указанный в RFC 2396, не всегда может отличить неправильно сформированный серверный компонент «authority» от законного регистрационного компонента «authority». Поэтому он должен обрабатывать некоторые случаи первого как случаи второго. Например, компонент «authority» в строке URI "//foo:bar", не является законным серверным компонентом «authority», но является законным регистрационным компонентом «authority».

Во многих распространённых ситуациях, например, при работе с URI, которые, как известно, являются либо URN, либо URL, используемые иерархические URI всегда являются серверными. Поэтому они должны быть обработаны как таковые или обработаны как ошибка. В таких случаях можно использовать утверждение, такое как

URIu= new URI(str).parseServerAuthority();

для того, чтобы убедиться, что u всегда ссылается на URI, который, если он имеет компонент «authority», имеет серверный компонент «authority» с правильными компонентами «user-information», «host» и «port». Вызов этого метода также гарантирует, что если компонент «authority» не удалось разобрать таким образом, то может быть выдано соответствующее диагностическое сообщение на основе исключения, которое было сгенерировано.

Возвращает:
URI, в котором поле «authority» обработано как серверный компонент «authority»
Исключения:
URISyntaxException - Если компонент «authority» этого URI определён, но не может быть разобран как серверный компонент «authority» в соответствии с RFC 2396

normalize

public URI normalize()

Нормализует путь этого URI.

Если этот URI является неиерархическим, или если его путь уже в нормальной форме, то возвращается этот URI. В противном случае создаётся новый URI, идентичный этому URI, за исключением того, что его путь вычисляется путём нормализации пути этого URI в соответствии с RFC 2396, раздел 5.2, шаг 6, подшаги с c по f; то есть:

  1. Все "." сегменты удаляются.

  2. Если ".." сегмент предшествует не-".." сегменту, то оба эти сегмента удаляются. Этот шаг повторяется до тех пор, пока он больше не применим.

  3. Если путь является относительным, и если его первый сегмент содержит символ двоеточия (':' ), то предваряется "." сегмент. Это предотвращает преобразование относительного URI с таким путём, как "a:b/c/d", в неиерархический URI со схемой "a" и специфической для схемы частью "b/c/d". (Отклонение от RFC 2396)

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

Возвращает:
URI, эквивалентный этому URI, но чей путь находится в нормальной форме

resolve

public URI resolve(URI uri)

Разрешает заданный URI относительно этого URI.

Если заданный URI уже абсолютный, или если этот URI неиерархический, то возвращается заданный URI.

Если компонент фрагмента заданного URI определён, его компонент пути пуст, а компоненты схемы, авторизации и запроса не определены, то возвращается URI с заданным фрагментом, но со всеми другими компонентами, равными компонентам этого URI. Это позволяет использовать URI, представляющий собой отдельную ссылку на фрагмент, такой как "#foo", для эффективного разрешения относительно базового URI.

В противном случае этот метод строит новый иерархический URI в соответствии с RFC 2396, раздел 5.2; то есть:

  1. Создаётся новый URI со схемой этого URI и компонентами запроса и фрагмента заданного URI.

  2. Если у заданного URI есть компонент «authority», то компонент «authority» и путь нового URI берутся из заданного URI.

  3. В противном случае компонент «authority» нового URI копируется из этого URI, а его путь вычисляется следующим образом:

    1. Если путь заданного URI абсолютный, то путь нового URI берётся из заданного URI.

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

Результат этого метода является абсолютным тогда и только тогда, когда этот URI или заданный URI являются абсолютными.

Параметры:
uri - URI, который должен быть разрешён относительно этого URI
Возвращает:
Результат URI
Исключения:
NullPointerException - Если uri является null

resolve

public URI resolve(String str)

Создаёт новый URI, разбирая заданную строку и затем разрешая её относительно этого URI.

Этот удобный метод работает так, как будто вызов эквивалентен вычислению выражения resolve(URI.create(str)).

Параметры:
str - Строка, которая должна быть обработана как URI
Возвращает:
Результат URI
Исключения:
NullPointerException - Если str является null
IllegalArgumentException - Если заданная строка нарушает RFC 2396

relativize

public URI relativize(URI uri)

Относительно заданного URI относительно этого URI.

Релятивизация заданного URI относительно этого URI вычисляется следующим образом:

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

  2. В противном случае создаётся новый относительный иерархический URI с компонентами запроса и фрагмента, взятыми из заданного URI, и с компонентом пути, вычисленным путём удаления пути этого URI из начала пути заданного URI.

Параметры:
uri - URI, который должен быть относительным по отношению к этому URI
Возвращает:
Результат URI
Исключения:
NullPointerException - Если uri является null

toURL

public URL toURL()
          throws MalformedURLException

Создаёт URL из этого URI.

Этот удобный метод работает так, как будто его вызов эквивалентен вычислению выражения new URL(this.toString()) после первоначальной проверки того, что этот URI является абсолютным.

Возвращает:
URL, созданный из этого URI
Исключения:
IllegalArgumentException - Если этот URL не абсолютный
MalformedURLException - Если обработчик протокола для URL не был найден или произошла какая-либо другая ошибка при построении URL

getScheme

public String getScheme()

Возвращает компонент «scheme» этого URI.

Компонент «scheme» URI, если он определён, содержит только символы из категории alphanum и в строке "-.+". Схема всегда начинается с символа alpha.

Компонент «scheme» URI не может содержать закодированные октеты, поэтому этот метод не выполняет никакого декодирования.

Возвращает:
Компонент «scheme» этого URI или null , если схема не определена

isAbsolute

public boolean isAbsolute()

Определяет, является ли этот URI абсолютным.

URI является абсолютным тогда и только тогда, когда он имеет компонент «scheme».

Возвращает:
true если, и только если, этот URI является абсолютным

isOpaque

public boolean isOpaque()

Определяет, является ли этот URI неиерархическим.

URI является неиерархическим, если и только если он является абсолютным, и его специфическая для схемы часть не начинается с символа косой черты ('/'). Неиерархический URI имеет схему, специфическую для схемы часть и, возможно, фрагмент; все другие компоненты не определены.

Возвращает:
true если и только если этот URI является неиерархическим

getRawSchemeSpecificPart

public String getRawSchemeSpecificPart()

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

Специфическая для схемы часть URI содержит только допустимые символы URI.

Возвращает:
Необработанная специфическая для схемы часть этого URI (никогда null)

getSchemeSpecificPart

public String getSchemeSpecificPart()

Возвращает декодированную схемоспецифическую часть этого URI.

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

Возвращает:
Декодированная схемоспецифическая часть этого URI (никогда null)

getRawAuthority

public String getRawAuthority()

Возвращает необработанную компонент власти этого URI.

Компонент власти URI, если он определен, содержит только символ «@» ('@') и символы из категорий unreserved, punct, escaped и other. Если власть основана на сервере, то она дополнительно ограничена наличием корректных компонентов пользователя, хоста и порта.

Возвращает:
Необработанная компонент власти этого URI, или null если власть не определена

getAuthority

public String getAuthority()

Возвращает декодированный компонент власти этого URI.

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

Возвращает:
Декодированный компонент власти этого URI, или null если власть не определена

getRawUserInfo

public String getRawUserInfo()

Возвращает необработанный компонент пользовательских данных этого URI.

Компонент пользовательских данных URI, если он определен, содержит только символы из категорий unreserved, punct, escaped и other.

Возвращает:
Необработанный компонент пользовательских данных этого URI, или null если пользовательские данные не определены

getUserInfo

public String getUserInfo()

Возвращает декодированный компонент пользовательских данных этого URI.

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

Возвращает:
Декодированный компонент пользовательских данных этого URI, или null если пользовательские данные не определены

getHost

public String getHost()

Возвращает компонент хоста этого URI.

Компонент хоста URI, если он определен, будет иметь один из следующих форматов:

  • Доменное имя, состоящее из одного или нескольких метки, разделенных точками ('.'), необязательно с завершающей точкой. Каждая метка состоит из символов alphanum и дефисов ('-'), хотя дефисы никогда не встречаются в качестве первого или последнего символа метки. Правая метка доменного имени, состоящего из двух или более меток, начинается с символа alpha.

  • Адрес IPv4 в формате цифра+.цифра+.цифра+.цифра+, где ни одна последовательность цифр не длиннее трёх символов и ни одна последовательность не имеет значения больше 255.

  • Адрес IPv6 в квадратных скобках ('[' и ']') и состоящий из шестнадцатеричных цифр, двоеточий (':') и, возможно, вложенного адреса IPv4. Полный синтаксис адресов IPv6 указан в RFC 2373: Архитектура адресации IPv6.

Компонент хоста URI не может содержать экранированные октеты, поэтому этот метод не выполняет декодирование.
Возвращает:
Компонент хоста этого URI, или null если хост не определён

getPort

public int getPort()

Возвращает номер порта этого URI.

Компонент порта URI, если он определен, является неотрицательным целым числом.

Возвращает:
Компонент порта этого URI, или -1 если порт не определен

getRawPath

public String getRawPath()

Возвращает необработанный компонент пути этого URI.

Компонент пути URI, если он определен, содержит только символ косой черты ('/'), символ «@» ('@') и символы из категорий unreserved, punct, escaped и other.

Возвращает:
Компонент пути этого URI, или null если путь не определен

getPath

public String getPath()

Возвращает декодированный компонент пути этого URI.

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

Возвращает:
Декодированный компонент пути этого URI, или null если путь не определен

getRawQuery

public String getRawQuery()

Возвращает необработанный компонент запроса этого URI.

Компонент запроса URI, если он определен, содержит только допустимые символы URI.

Возвращает:
Необработанный компонент запроса этого URI, или null если запрос не определен

getQuery

public String getQuery()

Возвращает декодированный компонент запроса этого URI.

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

Возвращает:
Декодированный компонент запроса этого URI, или null если запрос не определен

getRawFragment

public String getRawFragment()

Возвращает необработанный компонент фрагмента этого URI.

Компонент фрагмента URI, если он определен, содержит только допустимые символы URI.

Возвращает:
Необработанный компонент фрагмента этого URI, или null если фрагмент не определен

getFragment

public String getFragment()

Возвращает декодированный компонент фрагмента этого URI.

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

Возвращает:
Декодированный компонент фрагмента этого URI, или null если фрагмент не определен

equals

public boolean equals(Object ob)

Проверяет равенство этого URI с другим объектом.

Если заданный объект не является URI, то этот метод сразу возвращает false.

Для равенства двух URI требуется, чтобы оба они были либо неявными, либо иерархическими. Их схемы должны быть либо обе не определены, либо равны без учета регистра.

Для двух неявных URI для равенства требуется, чтобы их схемоспецифические части были равны.

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

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

Этот метод удовлетворяет общему контракту метода Object.equals.

Overrides:
equals в классе Object
Параметры:
ob - Объект, с которым должен сравниваться этот объект
Возвращает:
true если, и только если, заданный объект является URI, идентичным этому URI
См. также:
Object.hashCode(), HashMap

hashCode

public int hashCode()

Возвращает значение хэш-кода для этого URI. Хэш-код основан на всех компонентах URI и удовлетворяет общему контракту метода Object.hashCode.

Overrides:
hashCode в классе Object
Возвращает:
Значение хэш-кода для этого URI
См. также:
Object.equals(java.lang.Object), System.identityHashCode(java.lang.Object)

compareTo

public int compareTo(URI that)

Сравнивает этот URI с другим объектом, который должен быть URI.

При сравнении соответствующих компонентов двух URI, если один компонент не определен, а другой определен, то первый считается меньше второго. За исключением случаев, когда указано иное, строковые компоненты упорядочиваются в соответствии с их естественным, регистронезависимым порядком, как определено методом String.compareTo. Строковые компоненты, которые подлежат кодированию, сравниваются по их исходным формам, а не по закодированным формам.

Порядок URI определяется следующим образом:

  • Два URI с различными схемами упорядочиваются в соответствии с порядком их схем, без учета регистра.

  • Иерархический URI считается меньше, чем непрозрачный URI с идентичной схемой.

  • Два непрозрачных URI с идентичными схемами упорядочиваются в соответствии с порядком их компонентов, специфичных для схемы.

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

  • Два иерархических URI с идентичными схемами упорядочиваются в соответствии с порядком их компонентов авторитета:

    • Если оба компонента авторитета основаны на сервере, то URI упорядочиваются в соответствии с их компонентами информации о пользователе; если эти компоненты идентичны, то URI упорядочиваются в соответствии с порядком их хостов, без учета регистра; если хосты идентичны, то URI упорядочиваются в соответствии с порядком их портов.

    • Если один или оба компонента авторитета основаны на реестре, то URI упорядочиваются в соответствии с порядком их компонентов авторитета.

  • Наконец, два иерархических URI с идентичными схемами и компонентами авторитета упорядочиваются в соответствии с порядком их путей; если их пути идентичны, то они упорядочиваются в соответствии с порядком их запросов; если запросы идентичны, то они упорядочиваются в соответствии с порядком их фрагментов.

Этот метод удовлетворяет общему соглашению метода Comparable.compareTo.

Определено в:
compareTo в интерфейсе Comparable<URI>
Параметры:
that - Объект, с которым должен быть сравнен этот URI
Возвращает:
Отрицательное целое число, ноль или положительное целое число, в зависимости от того, меньше, равен или больше этот URI, чем заданный URI
Исключение:
ClassCastException - Если заданный объект не является URI

toString

public String toString()

Возвращает содержимое этого URI в виде строки.

Если этот URI был создан путем вызова одного из конструкторов в этом классе, то возвращается строка, эквивалентная исходной строке ввода или строке, вычисленной из исходных компонентов, в зависимости от ситуации. В противном случае этот URI был создан путем нормализации, разрешения или относительной записи, и поэтому строка строится из компонентов этого URI в соответствии с правилами, указанными в RFC 2396, раздел 5.2, шаг 7.

Переопределяет:
toString в классе Object
Возвращает:
Строковая форма этого URI

toASCIIString

public String toASCIIString()

Возвращает содержимое этого URI в виде строки US-ASCII.

Если этот URI не содержит символов в категории другие, то вызов этого метода вернет то же значение, что и вызов метода toString. В противном случае этот метод работает так, как если бы он вызывал этот метод, а затем кодировал результат.

Возвращает:
Строковая форма этого URI, закодированная по мере необходимости, так, чтобы она содержала только символы набора символов US-ASCII

© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/URI.html

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