Классы URL и URLConnection инкапсилируют большую часть всех сложных подробностей процесса извлечения информации с удаленного узла. Объект URL создается следующим образом:
1 |
URL url = new URL(строка_URL); |
Для простого извлечения содержимого заданного ресурса достаточно использовать метод openStream() класса URL. Этот метод возвращает объект InputStream. Поток данного типа можно использовать обычным образом, например создать объект Scanner:
1 2 |
InputStream inStream = url.openStream(); Scanner in = new Scanner(inStream); |
Пакет java.net различает унифицированные указатели ресурсов(uniform resource locator — URL) и унифицированные идентификаторы ресурсов(uniform resource identificator — URI).
URI — это лишь синтаксическая конструкция, которая содержит различные части строки, описывающей Web-ресурс. URL — это особый вид URI-идентификатора с информации о расположении ресурса.
Например, URI mailto:admin@pro-java.ru не является указателем, потому что не указывает на какие-либо данные. Такой URI называется унифицированным именем ресурса(uniform resource name — URN).
В библиотеке Java класс URI не имеет методов доступа к указанному им ресурсу, так как предназначен только для синтаксического разбора строки. В отличии от него, класс URL может открыть поток для данного ресурса. Поэтому класс URL может работать только со схемами, которые библиотека Java «умеет» обрабатывать, в частности, http:, https:, ftp:, указателями на позиции локальной файловой системы(file:) и JAR-файлы(jar:).
Разбор URI — задача далеко не тривиальная, поскольку идентификаторы ресурсов могут иметь сложную структуру. В качестве примера рассмотрим следующие URI:
1 2 |
http://maps.yahoo.com/py/maps.py?csz=Cupertino+CA ftp://username:password@ftp.yourserver.com/pub/file.txt |
Спецификация URI задает правила построения этиъ идентификаторов. Структура URI выглядит следующим образом:
1 |
[схема:] специальная_часть[#фрагмент] |
Здесь квадратные скобки( [] ) обозначают необязательную часть, а двоеточие и символ # являются разделителями. Если схема: присутствует в URI, то он называется абсолютным, а в противном случае — относительным.
Абсолютный URI называется непрозрачным, если специальная_часть не начинается с косой черты( / ), например, имеет вид:
1 |
mailto:admin@pro-java.ru |
Все абсолютные прозрачные URI и все относительные URL имеют иерархию структуру. Соответствующие примеры приведены ниже:
1 2 |
http://java.sun.com/index.html ../../java/net/Socket.html#Socket() |
Компонент специальная_часть иерархического URI имеет такую структуру:
1 |
[/полномочия][путь][?запрос] |
Здесь квадратные скобки( [] ) тоже обозначают необязательную часть.
В URI серверов компонент полномочия имеет следующую форму:
1 |
[информация_о_пользователе@]имя_компьютера[:port] |
Элемент порт должен иметь целочисленное значение. В документе RFC 2396, определяющем стандарт URI, также допускается механизм указания этой части в другом формате на основе информации из реестра, но он не получил широкого распространения.
Одна из основных задач класса URI заключается в синтаксическом разборе отдельных компонентов идентификатора и извлечении их с помощью перечисленных ниже методов:
- getScheme
- getSchemeSpecificPart
- getAuthority
- getUserInfo
- getHost
- getPort
- getPath
- getQuery
- getFragment
Другая задача класса URI состоит в обработке абсолютных и относительных идентификаторов. Предположим, например, что в нашем распоряжении есть абсолютный и относительный URL:
1 2 |
http://docs.company.com/api/java/net/ServerSocket.html ../../java/net/Socket.html#Socket() |
На основании этой информации можно определить абсолютный URI, соответствующий относительному идентификатору:
1 |
http://docs.company.com/api/java/net/Socket.html#Socket() |
Этот процесс называется преобразованием(resolving) относительного URI.
Обратный процесс называется преобразованием абсолютных адресов в относительные(relativization). Например, имея базовый URI http://docs.mycompany.com/api, можно получить для абсолютного URI http://docs.mycompany.com/api/java/lang/String.html относительный URI java/lang/String.html.
Для выполнения этих операций в классе URI предусмотрено два соответствующих метода:
1 2 |
relative = base.relativize(combined); combined = base.resolve(relative); |