JavaRush /Курсы /Java Syntax Pro /Работа с сетью

Работа с сетью

Java Syntax Pro
15 уровень , 6 лекция
Открыта

1. Класс URL

Работу с потоками ввода-вывода мы уже изучили, работу с файлами изучили, что же изучить дальше? А как насчет работы с сетью и интернетом? Звучит многообещающе, не так ли?

В Java работать с интернетом не сложнее, чем работать с файлами. Ну разве что совсем чуть-чуть.

Для работы с ресурсами в интернете в Java есть специальный класс — URL. Он простой, как табуретка, в чем вы сейчас и убедитесь.

Получение странички из интернета

Как вы думаете, сколько строк кода нужно написать, чтобы скачать какой-нибудь текстовый файл из интернета и отобразить его содержимое на экране? 10? 100? 1000? А может быть, 5?

Код Примечание
URL url = new URL("https://javarush.com");
InputStream input = url.openStream();
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
Создает объект URL с путем к странице
Получает InputStream у интернет-объекта
Читает все байты и возвращает массив байт
Преобразуем массив в строку
Выводим строку на экран

На экране отобразится содержимое HTML-файла:

Вывод на экран
<!DOCTYPE html><html lang="ru" class="light"><head>
    <meta charset="utf-8″>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1″>
    ...

Сравнение работы File и URL

URL — это такой аналог File или Path, только Path хранит путь к ресурсу в файловой системе, а URL — путь к ресурсу в интернете.

Вся магия происходит, когда мы за один вызов метода openStream() получаем сразу объект типа InputStream. Это же стандартный объект, и мы его уже изучили вдоль и поперек. Все становится очевидно уже после получения объекта типа InputStream. Ведь как вычитать из него данные, мы уже знаем.

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

Работа с интернетом Работа с файлом
URL url = new URL("https://javarush.com");
InputStream input = url.openStream(); 
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
File file = new File("c:\\readme.txt");
InputStream input = new FileInputStream(file);

byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);


2. Класс URLConnection

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

Код Примечание
URL url = new URL("https://javarush.com");
URLConnection connection = url.openConnection();

// получили поток для отправки данных
OutputStream output = connection.getOutputStream();
output.write(1); // отправляем данные

// получили поток для чтения данных
InputStream input = connection.getInputStream();
int data = input.read(); // читаем данные
Создаем объект 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.

В принципе ничего сложного. В самой простой интерпретации этот код будет выглядеть так:

Сохранение файла на диск
String image = "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
URL url = new URL(image);
InputStream input = url.openStream();

Path path = Path.of("c:\\GoogleLogo.png");
Files.copy(input, path);

С помощью трех первых строк мы получаем поток данных от интернет-ресурса — от картинки.

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

Ну и наконец, последняя строка — это один из методов copy класса Files. У класса Files их несколько. Этот метод, который мы использовали, принимает в качестве первого параметра источник данных — байтовый поток (InputStream), а в качестве второго параметра — имя файла, куда нужно записывать данные.

Теоретически, если бы URL картинки был коротким, этот код вообще можно было бы записать в одну строку:

Копирование данных из потока в файл
Files.copy(
   new URL("https://www.google.com/logo.png").openStream(),
   Path.of("c:\\GoogleLogo.png")
);

Писать так, конечно же, не нужно, однако этот пример демонстрирует, насколько удобные и мощные в Java потоки ввода-вывода.



Комментарии (299)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Виктор Уровень 21
19 июля 2025
Тяжело, часто откатывюсь назад из за непонятого ранее.
Podaytesigy Уровень 20
27 июля 2025
Нелегко в учение, друг, легко в бою
Anonymous #3585174 Уровень 33
16 июля 2025
Like
Alex Уровень 22
28 июня 2025
Тут вопрос в другом, на фига ыообще нужна эта статья, когда в прчледней строке буквально говорится, что так делать не нужно!!! Может сначала надо ПРАВИЛЬНО учить?
Alina Gabidulina Уровень 12
25 июня 2025
В этой лекции будто редактор совсем обленился,из последней задачи: Используй методы setDoOutput(true) и getOutputStream() класса URLConnection ладно есть пару слов про getOutputStream(), но про setDoOutput(true) ни слова, я не злюсь, но просто не понятно почему нельзя сделать также как и в других случаях таблицу с методами?
Mikhail Уровень 35
5 июня 2025
Ужасный уровень! Понимания не осталось от слова совсем!
Robert Уровень 17
12 апреля 2025
Пока самый ужасный уровень. Я зашел спустя три месяца перерыва, и вспомнил почему я так давно не заходил. После этого уровня, действительно больше не хотелось продолжать заниматься на этой платформе. Я прекрасно понимаю, что одно из важнейших умений программиста - гуглить. Но тогда зачем я заплатил за подписку? Чтобы потом уйти на другие источники?
Danya Уровень 17
4 мая 2025
зайди чекни видео из ютуба,углубись в то место в котором тебе не понятно,зайди в chatgpt и там напиши какие методы и что тебе не понятно.Тем не менее тема ввода и вывода проходится в синтаксисе java и от неё не убежишь и если ты поменяешь платформу ничего не изменится ты встретишь одно и тоже
Anonymous #3552725 Уровень 32
7 апреля 2025
Установка значения setDoOutput(true) в классе URLConnection обозначает, что соединение будет использоваться для вывода, то есть для отправки данных на сервер.
Anonymous #3116825 Уровень 1
6 апреля 2025
Как я могу решить задачу, если в ней используется неизученные инструменты? Как же горит с этого.🤬 И так опускаются руки от того, что не все понятно, где то застреваешь. Так еще находятся выскочки, которые язвят мол все изи, это я тупой, поищи в интернете. Почему, покупая годовой курс обучения, я вынужден изучать темы на других ресурсах, чтобы пройти эти тему здесь? Почти весь раздел с потоками такой. Вроде javarush позиционируется как образовательная площадка для новичков, для нулей. По крайней мере, этот курс. Изучать что то как то где то в интернете я и сам могу. Мне же предлагают за плату предоставить последовательный структурированный обучающий материал. Но где он?
Rasul Shidakov Уровень 20
3 апреля 2025
public class Solution { public static void main(String[] args) throws IOException { URL url = new URL("http://httpbin.org/post"); //ссылка к публичному апи //напишите тут ваш код URLConnection connection = url.openConnection(); //создали поток(связь) с урл страницей connection.setDoOutput(true); //говорим программе, что будем отправлять данные try (OutputStream outputStream = connection.getOutputStream()) { Scanner scanner = new Scanner(System.in); String string = scanner.nextLine(); byte[] bytes = string.getBytes(); outputStream.write(bytes); } try (InputStream input = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(input))) { while (reader.ready()) System.out.println(reader.readLine()); } } } и скажите, почему не принимается этот код
Влад Кузьмин Уровень 29
5 марта 2025
Полгода назад сдался на этом уровне, и на неделе просмотрел достаточно материала на тему потоков в/в и работы с файлами на сторонних ресурсах, и незаметно прохожу все задачки и лекции, но тут же возникает вопрос к опытным коллегам: следующие уровни такие же непутевые или же этот уровень исключение, а остальной материал годный?
4 апреля 2025
Есть области, где это может пригодиться. Знать о таких вещах смысл есть, чтобы при желании найти документацию и сделать задачу. Учить наизусть не надо. Большинство джава программистов работу с файлами видит только в обучающих курсах и книгах. В реальной работе обычно есть АПИ, интеграции и базы данных.
Олег Сычев Уровень 12
1 мая 2025
Как же скачивание и загрузка файлов в веб приложение? Или работа с json файлами? По-моему, очень даже часто используемый функционал
2 мая 2025
Последний раз загружать файлы в веб приложение была необходимость лет 6 назад и то, потому что криво было придумано и не использовали проперти как надо. Не знаю чем вы конкретно занимаетесь, но в моем мире это знание просто не используется.