JavaRush /Курсы /Java Core /InputStream/OutputStream

InputStream/OutputStream

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

— Привет, Амиго! Сегодня мы снова будем заниматься разбором работы InputStream и OutputStream. На самом деле, то первое объяснение было немного упрощенным. Это не интерфейсы, а абстрактные классы, и они даже имеют по паре реализованных методов. Давай посмотрим, какие методы у них есть:

Методы класса InputStream Что метод делает
int read(byte[] buff);
— метод сразу читает блок байт в буфер (массив байт), пока буфер не заполнится или не закончатся байты там, откуда он их читает.
Метод возвращает количество реально прочитанных байт (оно может быть меньше длины массива)
int read();
— метод читает один байт и возвращает его как результат. Результат расширяется до int, для красоты. Если все байты уже прочитаны, метод вернет «-1».
int available();
— метод возвращает количество непрочитанных (доступных) байт.
void close();
— метод «закрывает» поток – вызывается после окончания работы с потоком.
Объект выполняет служебные операции, связанные с закрытием файла на диске и т.д.
Из потока больше нельзя читать данные.

— Т.е. мы можем читать не только по одному байту, а и целыми блоками?

— Да.

— А записывать целыми блоками тоже можно?

— Да, вот смотри:

Методы OutputStream Что метод делает
void write(int c);
— метод записывает один байт информации. Тип int сужается до byte, лишняя часть просто отбрасывается.
void write(byte[] buff);
— метод записывает блок байт.
void write(byte[] buff, int from, int count);
— метод записывает часть блока байт. Используется в случаях, когда есть вероятность, что блок данных был заполнен не целиком
void flush();
— если есть данные, которые хранятся где-то внутри и еще не записаны, то они записываются.
void close();
— метод «закрывает» поток – вызывается после окончания работы с потоком.
Объект выполняет служебные операции, связанные с закрытием файла на диске и т.д.В поток больше нельзя писать данные, flush при этом вызывается автоматически.

— А как будет выглядеть код копирования файла, если мы будем читать не по одному байту, а целыми блоками?

— Гм. Примерно так:

Копируем файл на диске
public static void main(String[] args) throws Exception {
    //Создаем поток-чтения-байт-из-файла
    FileInputStream inputStream = new FileInputStream("c:/data.txt");
    // Создаем поток-записи-байт-в-файл
    FileOutputStream outputStream = new FileOutputStream("c:/result.txt");

    byte[] buffer = new byte[1000];
    while (inputStream.available() > 0) //пока есть еще непрочитанные байты {
        // прочитать очередной блок байт в переменную buffer и реальное количество в count
        int count = inputStream.read(buffer);
        outputStream.write(buffer, 0, count); //записать блок(часть блока) во второй поток
    }

    inputStream.close(); //закрываем оба потока. Они больше не нужны.
    outputStream.close();
}

— С буфером все понятно, а что это за переменная count?

— Когда мы читаем самый последний блок данных в файле, может оказаться, что байт осталось не 1000, а, скажем, 328. Тогда и при записи нужно указать, что записать не весь блок, а только его первые 328 байт.

Метод read при чтении последнего блока вернет значение равное количеству реально прочитанных байт. Для всех чтений – 1000, а для последнего блока – 328.

Поэтому при записи блока мы указываем, что нужно записать не все байты из буфера, а только 328 (т.е. значение, хранимое в переменной count).

— Теперь понятно, как все это работает. Спасибо, Элли.

Комментарии (295)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #3585174 Уровень 33
2 сентября 2025
like
Ioanna Polyak Уровень 33
19 июня 2025
Крута!!!
9 июня 2025
Кто живой пройдет после меня, оставьте коммент, что бы было понимание, сколько нас двигается в этом "потоке"
10 июня 2025
ого свежий комент... я не один)
10 июня 2025
Ура, Ура, нас двое😂🤣😀
VadChet Уровень 29
12 июня 2025
Как минимум, трое✊
12 июня 2025
🥳
Zim4ik Уровень 51
15 июня 2025
4
22 июня 2025
5
Алина Уровень 28
23 июня 2025
6
DeepFryer Уровень 36
10 июля 2025
+
Flutter_girl Уровень 30
16 июля 2025
+
Alyona Уровень 29
28 июля 2025
9!!!!!!
28 июля 2025
9 человек за два месяца- это очень сильно) Меньше конкуренции при последующем трудоустройстве😂
Василий Уровень 28
1 августа 2025
10)Уже немного больше конкуренции)
Anonymous #3569405 Уровень 29
3 августа 2025
Путь начали сотни тысяч, а идут по нему лишь малая горстка людей...
4el0vek3 Уровень 36
6 августа 2025
+
Dmitry Уровень 29
8 августа 2025
11 )
8 августа 2025
🥳
dustik Уровень 29
19 августа 2025
hi)
19 августа 2025
Good evening!
Pushistii Kot Уровень 25
27 августа 2025
++
invoker main Уровень 42
4 октября 2025
😎
Максим Уровень 29
23 октября 2025
++
Zhenya Volkov Уровень 30
1 ноября 2025
ну и я отмечусь) чего уж там)
ТимБай Уровень 28
17 ноября 2025
я бегу за вами
Дмитрий Уровень 12
4 декабря 2024
Сначала вроде запутался, но потом вроде распутался и очень обидно, если распутался неправильно... Буду признателен, если кто поправит, если не прав. int x = inputStream.read(byte[] buff); Если в потоке, откуда я читаю, есть 3 байта, скажем, 22, 33 и 44, то результатом данной строчки я буду иметь записанные значения x = 3, byte[0] = 22, byte[1] = 33 и byte[2] = 44?
Anonymous #3396857 Уровень 14
16 декабря 2024
👌
{Java_Shark} Уровень 36
25 ноября 2024
++
Dantes Уровень 1
20 сентября 2024
Всем успехов ! Идем до конца )
NordØne Уровень 34
21 июля 2024
Иду потихоньку
20 августа 2024
Правильно!
Ra Уровень 16 Student
15 июля 2024
Пример из реальной жизни: загружаем файл из html формы на сервер. У него будет класс MultipartFile. А у этого класса есть метод file.getInputStream(); Правда, наверное никто в здравом уме им не пользуется, есть простой метод file.transferTo(newFilePath);
SomeBody098 Уровень 51
20 июня 2024
посылаю вам энергию котов!!! не сдавайтесь ))
Vlad Уровень 30
13 августа 2024
Посылаю вам энергию земли! Всех благ 😮
homasapienss Уровень 46
13 мая 2024
я тут был