Input и Output Streams в Java представляют собой абстрактное представление источника (для Input) и приемника (для Output) данных. Они являются частью пакета java.io.
Основные классы:
InputStream: Базовый абстрактный класс для чтения байтов.OutputStream: Базовый абстрактный класс для записи байтов.Reader: Базовый абстрактный класс для чтения символов.Writer: Базовый абстрактный класс для записи символов.Работа с байтами и символами:
InputStream, OutputStream) работают с байтами.Ключевые концепции:
Декоратор (Wrapper) Pattern: Многие классы потоков являются "декораторами", оборачивающими другие потоки для добавления функциональности (например, буферизация, сжатие данных, преобразование типов). Например, BufferedInputStream оборачивает другой InputStream.
Последовательный доступ: Данные в потоке читаются или записываются последовательно.
Закрытие потоков: Важно закрывать потоки после использования для освобождения системных ресурсов (файловых дескрипторов, сетевых соединений). Часто используется try-with-resources:
java
Методы чтения/записи:
read(): Читает один байт (или символ) или возвращает -1 в конце потока.read(byte[] b): Читает байты в массив b. Возвращает количество прочитанных байтов или -1.read(byte[] b, int off, int len): Читает до len байтов со смещением off в массив b.write() для записи.Примеры конкретных реализаций Streams/Readers/Writers:
FileInputStream/FileOutputStream: Для работы с файлами.ByteArrayInputStream/ByteArrayOutputStream: Для работы с байтами в памяти.PipedInputStream/PipedOutputStream: Для обмена данными между потоками в одном процессе.SocketInputStream/SocketOutputStream: Для сетевых соединений.BufferedReader/BufferedWriter: Для буферизации чтения/записи, что улучшает производительность.InputStreamReader/OutputStreamWriter: Для преобразования байтовых потоков в символьные и обратно.Иерархия классов:
InputStream
FileInputStreamBufferedInputStreamObjectInputStream (для сериализации)OutputStream
FileOutputStreamBufferedOutputStreamObjectOutputStream (для сериализации)Reader
FileReaderBufferedReaderInputStreamReaderWriter
FileWriterBufferedWriterOutputStreamWriterВыбор между байтовыми и символьными потоками зависит от типа данных: байтовые для бинарных данных (изображения, исполняемые файлы), символьные для текстовых данных.