JavaRush /Курсы /Java Core /Стандартные интерфейсы: InputStream, OutputStream

Стандартные интерфейсы: 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 List<Integer> list =
    new ArrayList<>(Arrays.asList(111, 222, 333));
}
Для простоты представим, что наш класс содержит в себе один объект – ArrayList типа Integer. Наполним список тестовыми данными.

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

Код Описание
class MyClass {
    private List<Integer> list =
        new ArrayList<>(Arrays.asList(111, 222, 333));

    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) throws IOException {
    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();
}
3
Задача
Java Core, 3 уровень, 8 лекция
Недоступна
Набираем код Ӏ Java Core: 3 уровень, 8 лекция
Java Core: 3 уровень, 8 лекция. Иногда думать не надо, строчить надо! Как ни парадоксально звучит, порой пальцы «запоминают» лучше, чем сознание. Вот почему во время обучения в секретном центре JavaRush вы иногда встречаете задания на набор кода. Набирая код, вы привыкаете к синтаксису и зарабатываете немного материи. А ещё — боретесь с ленью.
Чтение объекта MyClass из файла
public static void main(String[] args) throws IOException {
    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. Потоки – это крутая вещь!

— А то!

Комментарии (354)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Exaltyr777 Уровень 25
1 сентября 2025
Таки в итоге что: чтобы из/в своего объекта записать данные в/из какой-то файл надо самому писать реализацию read/write у объекта своего класса? А нельзя просто воспользоваться другими классами с интерфейсом InputStream/OutputStream?
Anonymous #3585174 Уровень 33
6 августа 2025
like
Vyacheslav Уровень 30 Expert
8 мая 2025
Коротко о том почему Input/OutPutStream абстрактные - потому что они уже содержат базовую реализацию. Были бы они интерфейсами, то пришлось бы писать реализацию для каждого метода всем классам
Alexa_Paath Уровень 24
10 апреля 2025
Я очень быстро прохожу почти весь Java Core, но если честно эти лекции очень не информативные и я сижу параллельно ищу информацию и читаю книгу, чтобы действительно понять как это работает, а не просто для галочки пройти эти лекции. Пока что Java Core раздел не оправдывает мои ожидания, надеюсь дальше будут лекции по сильнее.
марк Уровень 25
25 марта 2025

А потом мы поговорим, почему же их все-таки сделали абстрактными классами.
ну видимо не поговорим
Victor Уровень 36
6 марта 2025
Набираем код - отличное занятие - надо таких побольше - видимо это первые опыты где автор курса испытывал свой валидатор.
Anonymous #3319931 Уровень 32
17 апреля 2025
Какой валидатор, о чем речь? Я даже на проверку не могу отправить
Slava Zinziver Уровень 28 Expert
8 января 2025
КРАЙНЕ странная лекция))Зачем называть абстрактные классы и их наследников интерфейсами?
ВК Уровень 36
5 декабря 2024
И это же те самые FileInputStream, FileOutputStream, про которые нам в первом модуле говорили что они уже устаревшие и небезопасные? Ну-ну...
Алексей Уровень 7
22 сентября 2024
понеслась!)
Антон Карпов Уровень 5
2 сентября 2024
Так почему их все-таки сделали абстрактными классами, а не интерфейсами, как вы в этой лекции называете?
Anonymous #3482594 Уровень 40
5 ноября 2024
скорее всего чтобы осуществить множественное наследование интерфейсов