undefined

Стандартные интерфейсы: InputStream, OutputStream

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

— Привет, Амиго! Сейчас я тебе расскажу про два интерфейса – InputStream и OutputStream. Объявлены они как абстрактные классы, но если начать разбираться, то можно увидеть, что по своей сути – это интерфейсы. Почти все их методы абстрактные, кроме нескольких незначительных методов. Очень похожи на нашего «телохранителя», которого мы рассматривали.

Это очень интересные интерфейсы. Пока что я специально буду называть их интерфейсы, чтобы ты понял, зачем они нужны. А потом мы поговорим, почему же их все-таки сделали абстрактными классами.

— Хорошо. Так что это за интерфейсы?

— Сейчас расскажу.

Есть такая интересная вещь в Java как «поток». Поток – это очень простая сущность. И его простота есть залог очень мощного механизма обмена данными. Потоки бывают двух видов: поток для чтения и поток для записи.

В поток для записи, как ты уже, наверное, догадался, можно записывать данные. Для этого у него есть метод write(). Из потока для чтения можно данные читать. Для этого у него есть метод read().

InputStream – это интерфейс потока чтения, описывающий такую способность: «из меня можно читать байты».

А OutputStream– это, соответственно, интерфейс потока записи, описывающий способность: «в меня можно записывать байты».

— И это все?

— Фактически да. Но все дело в том, что в Java есть очень много классов, которые умеют работать с интерфейсами InputStream и OutputStream. Например, ты хочешь прочитать файл с диска и вывести его содержимое на экран. Нет ничего проще.

Для того, чтобы прочитать данные из файла на диске, есть специальный класс FileInputStream, который реализует интерфейс InputStream. Хочешь записать прочитанные данные в другой файл? Для этого есть класс FileOutputStream, который реализует интерфейс OutputStream. Вот как выглядит код копирования [данных одного] файла в другой.

Код
public static void main(String[] args) throws IOException
{
 InputStream inStream = new FileInputStream("c:/source.txt");
 OutputStream outStream = new FileOutputStream("c:/result.txt");

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //читаем один байт из потока для чтения
  outStream.write(data); //записываем прочитанный байт в другой поток.
 }

 inStream.close(); //закрываем потоки
 outStream.close();
}

Представь, что мы написали класс, и добавили ему способности InputStream и OutputStream.

Если мы корректно реализовали поддержку этих интерфейсов, то объекты нашего класса теперь можно сохранить в файл на диске. Просто вычитав их содержимое через метод read. Или загрузить из файла, создав объект и записав в него содержимое файла через метод write.

— А можно пример?

— Можно.

Код Описание
class MyClass
{
private ArrayList<Integer> list;
}
Для простоты представим, что наш класс содержит в себе один объект – ArrayList типа Integer.

Теперь добавим в него методы read и write

Код Описание
class MyClass
{
private ArrayList<Integer> list;
public void write(int data)
{
list.add(data);
}
public int read()
{
int first = list.get(0);
list.remove(0);
return first;
}

public int available()
{
return list.size();
}
}
Теперь у нас в классе реализован метод read, который позволяет последовательно вычитать все содержимое нашего списка list.

И метод write, который позволяет записывать в наш list значения.

Это, конечно, не реализация интерфейсов InputStream и OutputStream, но очень похоже.

— Да, это понятно. А как все-таки сохранить содержимое такого объекта в файл?

— Давай я напишу тебе пример:

Запись объекта MyClass в файл
public static void main(String[] args)
{
 MyClass myObject = new MyClass();
 OutputStream outStream = new FileOutputStream ("c:/my-object-data.txt");

 while (myObject.available() > 0)
 {
  int data = myObject.read(); //читаем один int из потока для чтения
  outStream.write(data); //записываем прочитанный int в другой поток.
 }

 outStream.close();
}
undefined
3
Задача
Java Core,  3 уровень,  8 лекция
Недоступна
Набираем код Ӏ Java Core: 3 уровень, 8 лекция
Java Core: 3 уровень, 8 лекция. Иногда думать не надо, строчить надо! Как ни парадоксально звучит, порой пальцы «запоминают» лучше, чем сознание. Вот почему во время обучения в секретном центре JavaRush вы иногда встречаете задания на набор кода. Набирая код, вы привыкаете к синтаксису и зарабатываете немного материи. А ещё — боретесь с ленью.
Чтение объекта MyClass из файла
public static void main(String[] args)
{
 InputStream inStream = new FileInputStream("c:/my-object-data.txt");
 MyClass myObject = new MyClass();

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //читаем один int из потока для чтения
  myObject.write(data); //записываем прочитанный int в другой поток.
 }

 inStream.close(); //закрываем потоки
}

— Ух ты! Действительно, очень похоже на работу с InputStream/OutputStream. Потоки – это крутая вещь!

— А то!

Комментарии (220)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
CondrCat 16 уровень, Красноярск
4 мая 2021
8 уровень: 11 уровень: 13 уровень:
Сергей Коваленко 29 уровень, Краснодар
16 апреля 2021
А вот последний пример "Чтение объекта MyClass из файла" По логике он же наоборот должен называться "Записываем в объект MyClass данные из файла bla bla bla.." 🙄
Vladimir 32 уровень, Краснодар
11 апреля 2021
То-ли я дурак, то-ли лыжи не едут! Как мы можем записать инт значение в файл посредством OutputStream.write() если он записывает байты??? Во первых при открытии файла текстовым редактором там будет абракадабра, а во вторых при чтении InputStream считывает также байты, поэтому полученный список будет содержать совсем другие значения. Не пойму зачем приводить такой пример если он некорректно работает? Лучше бы показали как правильно записывать коллекции в файл!
ric ric 22 уровень
9 марта 2021
🌚, [09.03.21 10:49] вообще странная фигня вот предыдущая лекция говорит нельзя создать объект абстр. класса и интерфейса 🌚, [09.03.21 10:50] открываю след. лекцию про инпут и отпут где сразу сказано что они объявлены как абстр. классы, а суть - интерфейсы 🌚, [09.03.21 10:50] и в примере сразу создают по объекту каждого типа 😱 хотя это вроде как нельзя ребят объясните чё за путаница?
ConsT 19 уровень
3 марта 2021
Лекция вбивает в голову что InputStream и OutputStream это "по сути интерфесы". Ну вот зачем так путать??? Если в примерах кода видно что это совсем не так, и это совершенно сбивает с толку, когда перед этим нам рассказывали о принципиальных отличиях класса и интерфейса. InputStream это базовый класс. Именно класс, с подклассами но не интерфейс!
Dmitry 18 уровень, Екатеринбург
7 февраля 2021
Есть кто из будущего? Что нас ждет за большая задача на интерфейсы на уровне 4?
AlexeyN 16 уровень
2 февраля 2021
Кто ничего не понял (сам такой), вот отличная статья. https://java-course.ru/begin/io_file/
Александр 18 уровень, Екатеринбург
18 января 2021
Я один ничего не понял?
5 января 2021
Я просто опупел когда это увидел! Диего читает лекцию, но не дает N-ое количество задач!
🦔 Виктор 20 уровень, Москва Expert
2 января 2021
Сейчас я тебе расскажу про два интерфейса – InputStream и OutputStream. Объявлены они как абстрактные классы, но если начать разбираться, то можно увидеть, что по своей сути – это интерфейсы. — На редкость плохо рассказал, иной раз диву даёшься, как можно в учебные лекции такие сбивающие с толку вещи запихивать... Просто жмём далее, в следующей лекции подкинут статью, в которой лучше раскрыта данная тема: Разница между абстрактными классами и интерфейсами: «Вообще, никакие это не интерфейсы, а самые настоящие абстрактные классы. Теперь ты знаешь, что это такое, поэтому работать с ними будет намного проще :) InputStream — это абстрактный класс, который отвечает за байтовый ввод. В Java есть серия классов, наследующих InputStream. Каждый из них настроен таким образом, чтобы получать данные из разных источников». p.s. Или читаем комментарии судьи ниже, который разносит всё вплоть до Computer science ; ) Всё получится!