1. Класс URL
Работу с потоками ввода-вывода мы уже изучили, работу с файлами изучили, что же изучить дальше? А как насчет работы с сетью и интернетом? Звучит многообещающе, не так ли?
В Java работать с интернетом не сложнее, чем работать с файлами. Ну разве что совсем чуть-чуть.
Для работы с ресурсами в интернете в Java есть специальный класс — URL
. Он простой, как табуретка, в чем вы сейчас и убедитесь.
Получение странички из интернета
Как вы думаете, сколько строк кода нужно написать, чтобы скачать какой-нибудь текстовый файл из интернета и отобразить его содержимое на экране? 10? 100? 1000? А может быть, 5?
Код | Примечание |
---|---|
|
Создает объект URL с путем к странице Получает InputStream у интернет-объектаЧитает все байты и возвращает массив байт Преобразуем массив в строку Выводим строку на экран |
На экране отобразится содержимое HTML-файла:
Вывод на экран |
---|
|
Сравнение работы File
и URL
URL
— это такой аналог File
или Path
, только Path
хранит путь к ресурсу в файловой системе, а URL
— путь к ресурсу в интернете.
Вся магия происходит, когда мы за один вызов метода openStream()
получаем сразу объект типа InputStream
. Это же стандартный объект, и мы его уже изучили вдоль и поперек. Все становится очевидно уже после получения объекта типа InputStream
. Ведь как вычитать из него данные, мы уже знаем.
Сравните: отличаются только две первые строчки, и то немного. Вот оно, преимущество стандартизации и работы с цепочками потоков данных:
Работа с интернетом | Работа с файлом |
---|---|
|
|
2. Класс URLConnection
Кроме простого чтения данных из интернета, мы еще можем и загружать туда данные. Загрузка данных — это куда более сложный процесс, чем считывание. Вам понадобится на несколько методов больше. Пример:
Код | Примечание |
---|---|
|
Создаем объект URL с путем к странице Создаем двустороннее соединение Получаем поток вывода Выводим в него данные Получаем поток ввода Читаем из него данные |
Обратите внимание, что тут мы больше не вызываем метод url.openStream()
. Вместо этого мы идем по более длинному пути:
- Сначала мы устанавливаем стабильное двустороннее соединение с помощью метода
URLConnection openConnection()
- Затем получаем поток для отправки данных с помощью метода
connection.getOutputStream()
и отправляем данные серверу - Затем получаем поток для чтения данных с помощью метода
connection.getInputStream()
и начинаем читать из него данные.
Контроль ресурсов
Строго говоря, мы должны все потоки обернуть в try
-with-resources для безопасной работы. А еще не помешало бы обернуть голые InputStream
и OutputStream
во что-нибудь более удобное. Например, в PrintStream
и BufferedReader
.
Если мы все это сделаем, наш код будет выглядеть как-то так:
URL url = new URL("https://javarush.com");
URLConnection connection = url.openConnection();
// отправляем данные
try (OutputStream output = connection.getOutputStream();
PrintStream sender = new PrintStream(output))
{
sender.println("Привет");
}
// читаем данные
try(InputStream input = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input)))
{
while (reader.ready())
System.out.println(reader.readLine());
}
3. Примеры работы с сетью
А давай-ка мы что-нибудь загрузим из интернета. И не просто загрузим, а сохраним на диск.
Например, давайте напишем программу, которая сохраняет на диск картинку с главной страницы Google.
В принципе ничего сложного. В самой простой интерпретации этот код будет выглядеть так:
Сохранение файла на диск |
---|
|
С помощью трех первых строк мы получаем поток данных от интернет-ресурса — от картинки.
В четвертой строке мы создаем имя файла, в который будем сохранять картинку. Имя может быть любым, однако расширение файла должно совпадать с расширением картинки в интернете. Так локальные программы просмотра картинок будут правильно ее открывать.
Ну и наконец, последняя строка — это один из методов copy класса Files
. У класса Files
их несколько. Этот метод, который мы использовали, принимает в качестве первого параметра источник данных — байтовый поток (InputStream
), а в качестве второго параметра — имя файла, куда нужно записывать данные.
Теоретически, если бы URL
картинки был коротким, этот код вообще можно было бы записать в одну строку:
Копирование данных из потока в файл |
---|
|
Писать так, конечно же, не нужно, однако этот пример демонстрирует, насколько удобные и мощные в Java потоки ввода-вывода.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
openConnection()
является методом классаURL
, а не классаURLConnection
?!?! Так как вызывается от экземпляра классаURL
, и возвращает экземпляр классаURLConnection
.