JavaRush /Курсы /Java Core /Потоки ввода/вывода

Потоки ввода/вывода

Java Core
8 уровень , 1 лекция
Открыта

— Привет, Амиго! Сегодня мы будет знакомиться с потоками ввода-вывода. Пару дней назад мы немного цепляли данную тему, но сегодня пройдемся по ней основательно. Потоки ввода-вывода делятся на 4 категории:

1) Потоки делятся по направлению: потоки ввода и потоки вывода

2) Потоки делятся по типу данных: работают с байтами или работают с символами.

Таблица:

Поток ввода Поток вывода
Работает с байтами InputStream OutputStream
Работает с символами Reader Writer

Если объект реализует интерфейс InputStream, значит, он поддерживает последовательное чтение из него байт (byte).

Если объект реализует интерфейс OutputStream, значит, он поддерживает последовательную запись в него байт (byte).

Если объект реализует интерфейс Reader, значит, он поддерживает последовательное чтение из него символов (char).

Если объект реализует интерфейс Writer, значит, он поддерживает последовательную запись в него символов (char).

Потоки ввода/вывода - 1

Поток вывода напоминает принтер. На принтер мы можем выводить документы. В поток вывода мы можем выводить данные.

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

— А где они используются?

— Эти классы используются в Java повсеместно. Известный нам System.in – это статическая переменная по имени in типа InputStream в классе System.

— Надо же! Оказывается, все это время я пользовался потоком InputStream и не знал об этом. System.out – тоже поток?

— Да, System.out – это статическая переменная по имени out типа PrintStream (наследник OutputStream) в классе System.

— Т.е. я все время пользовался потоками и даже не подозревал об этом?

— Да, и это говорит лишь о том, насколько такие потоки удобны. Просто берешь и пользуешься.

— Хотя этого нельзя сказать про System.in. К нему постоянно приходилось добавлять BufferedReader и InputStreamReader.

— Да, это так. Но на это тоже были свои причины.

Видишь ли, типов данных очень много, как и способов работы с ними. Поэтому количество стандартных классов ввода-вывода очень быстро росло, хоть они и делали все почти то же самое. Чтобы избежать такой сложности, разработчики Java применили принцип абстракции и разделили классы на много маленьких частей.

Зато их можно соединить последовательно и получить очень сложную функциональность, если она тебе понадобилась. Смотри пример:

Вывод строки на консоль
System.out.println("Hello");
Сохранили поток вывода на консоль в отдельную переменную.
Выводим в поток строку.
PrintStream console = System.out;
console.println("Hello");
Создали динамический (растягивающийся) массив байт в памяти.
Связали его с новым потоком вывода – объектов PrintStream
Выводим в поток строку.
ByteArrayOutputStream stream = new ByteArrayOutputStream();
PrintStream console = new PrintStream(stream);
console.println("Hello");

— Действительно, чем-то похоже на конструктор Lego. Только непонятно, что весь этот код делает.

— Пусть это тебя не беспокоит сейчас. Всему свое время.

Хочу, чтобы ты запомнил вот что: если класс реализует интерфейс OutputStream – он позволяет записывать в него байты. Почти так же, как ты выводишь данные на консоль. Что он будет с этими данными делать – его задача. В «конструкторе» важно не назначение отдельного элемента, а насколько классные вещи мы можем собрать, благодаря многообразию существующих элементов.

— Хорошо. Тогда с чего мы начнем?

Комментарии (196)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #3585174 Уровень 33
2 сентября 2025
like
Евгений Уровень 37
8 июня 2025
4 ноября 2024 - 1 уровень 10 ноября 2024 - 4 уровень 22 ноября 2024 - 10 уровень 8 января 2025 - 12 уровень 28 января - 14 уровень 16 февраля - 15 уровень 19 февраля -16 уровень 4 марта -17 уровень 20 марта -18 уровень 25 марта - 19 уровень 30 марта - 20 уровень 31 марта -21 уровень 1 апреля -22 уровень 5 апреля -23 уровень 26 апреля - 25 уровень 25 мая - 27 уровень 8 июня - 28 уровень
9 июня 2025
Медленно, но верно, главное в этом деле, не то, с какой скоростью вы двигаетесь, а что не останавливаетесь
Евгений Пикин Уровень 46
16 января 2025
— Хорошо. Тогда с чего мы начнем? — Откроем следующую лекцию за 🥶х18
Mikhail Lukin Уровень 35 Expert
13 февраля 2025
у меня более 1к материи, (хотя, я даже не все задачи то решил. Мб около половины). Это норм? поэтому как-то и не обращается внимание на: "— Откроем следующую лекцию за 🥶х18" 🤷‍♂️🤷‍♂️
Artem Korolev Уровень 2
3 марта 2025
норм, у меня материи 1400 и ещё не решенные задачи остались
Денис Кокшаров Уровень 32
7 марта 2025
ваще ни одну задачу не пропускаю, принципиально, прям каждую делаю
{Java_Shark} Уровень 36
19 ноября 2024
++
Денис Кокшаров Уровень 32
7 марта 2025
++Java_Shark
Nazadain Уровень 39
8 ноября 2024
8.11.24 идём дальше!
Maksim Russkih Уровень 34
23 августа 2024
lvl 28 23/08/2024 nice!
SomeBody098 Уровень 51
19 июня 2024
lvl 28 19.06.2024 lets go!
mikhailkuzmin Уровень 32
26 мая 2024
28 уровень, 26.05.2024. Всем удачи!
Somethingelse Уровень 32
26 апреля 2024
Поооотооооокииии!
Saf Уровень 36
7 мая 2024
😄👍
SomeBody098 Уровень 51
19 июня 2024
26 марта 2024
понял, лекции про потоки идут в обратном хронометраже! Сначала мы сами самостоятельно изучали Files,Path.nio в общем, когда решили задачи, нам дали лекции по nio.Теперь , конце курса java Core, мы готовы узнать, что же это такое io 7:-0
Павел К. Уровень 33
22 марта 2025
научитесь плавать - нальём в бассейн воду