Основные классы для работы с потоками ввода/вывода в Java находятся в пакете java.io. Они делятся на байтовые и символьные потоки.
Байтовые потоки:
Работают с байтами (8 бит):
InputStream: Абстрактный базовый класс для всех байтовых потоков ввода.FileInputStream: Для чтения байтов из файла.ByteArrayInputStream: Для чтения байтов из массива байтов в памяти.BufferedInputStream: Буферизует ввод для повышения производительности.DataInputStream: Читает примитивные типы данных (int, float и т.д.) в бинарном формате.ObjectInputStream: Десериализует объекты из потока.OutputStream: Абстрактный базовый класс для всех байтовых потоков вывода.FileOutputStream: Для записи байтов в файл.ByteArrayOutputStream: Для записи байтов в массив байтов в памяти.BufferedOutputStream: Буферизует вывод для повышения производительности.DataOutputStream: Записывает примитивные типы данных в бинарном формате.ObjectOutputStream: Сериализует объекты в поток.Символьные потоки:
Работают с символами (обычно 16 бит в Unicode):
Reader: Абстрактный базовый класс для всех символьных потоков ввода.FileReader: Для чтения символов из файла (использует кодировку по умолчанию).StringReader: Для чтения символов из строки.BufferedReader: Буферизует ввод символов для повышения производительности.InputStreamReader: Преобразует байтовые потоки в символьные, указывая кодировку.Writer: Абстрактный базовый класс для всех символьных потоков вывода.FileWriter: Для записи символов в файл (использует кодировку по умолчанию).StringWriter: Для записи символов в строку.BufferedWriter: Буферизует вывод символов для повышения производительности.OutputStreamWriter: Преобразует символьные потоки в байтовые, указывая кодировку.PrintWriter: Улучшенная версия Writer с удобными методами для печати различных типов данных.Пример использования:
Чтение файла построчно:
java
Запись в файл:
java
Для более сложных операций (работа с объектами, сериализация/десериализация) используются ObjectInputStream и ObjectOutputStream.
Выбор между байтовыми и символьными потоками зависит от типа данных: для бинарных данных (изображения, звуки) используются байтовые потоки, для текстовых данных — символьные. Классы-декораторы (например, BufferedInputStream, DataInputStream) добавляют дополнительную функциональность или повышают производительность базовых потоков. Использование try-with-resources гарантирует автоматическое закрытие потоков.