IO и NIO

Базовый Java
≈ 2 мин чтения

Как данные попадают в программу и выходят из неё

Программа редко живёт только в оперативной памяти. Она читает конфигурацию, сохраняет файлы, принимает байты из внешних источников и записывает результаты обратно. В Java для этого есть два близких семейства API: классические потоки из java.io и более современные инструменты из java.nio и java.nio.file.

В этом разделе мы не будем пытаться выучить десятки классов по именам. Гораздо важнее понять несколько моделей: путь к файлу, поток байтов, поток символов, буфер, канал и ресурс, который нужно корректно закрыть. После этого большая часть IO-кода становится предсказуемой.

Что будет внутри раздела

  • File и Path. Разберём, как представлять путь к файлу или каталогу и почему современный код обычно строится вокруг Path.
  • Байтовые потоки. Научимся читать и записывать необработанные байты через InputStream и OutputStream.
  • Символьные потоки. Перейдём от байтов к тексту и увидим роль Reader, Writer и кодировок.
  • Буферизированный ввод и вывод. Посмотрим, зачем между программой и источником данных часто добавляют буфер.
  • Класс Files. Соберём основные операции над файлами и каталогами в высокоуровневом API.
  • Channels и Buffers. Познакомимся с моделью NIO, где данные передаются между каналом и явным буфером.
  • Сериализация. Разберём встроенный механизм превращения объектов Java в поток байтов и обратно, а также его ограничения.
  • Ресурсы и try-with-resources. Свяжем всё вместе и закрепим безопасное управление файлами, потоками и другими закрываемыми ресурсами.

Темы идут от представления места, где лежат данные, к способам их чтения и записи. Сначала мы научимся выбирать подходящий уровень абстракции, затем — работать с более высокоуровневыми операциями и в конце разберём управление жизненным циклом ресурсов.

Path path = Path.of("data", "message.txt");
String text = Files.readString(path);

Эти две строки выглядят просто, но за ними уже стоят путь, файловая система, чтение данных и освобождение системных ресурсов. Дальше разберём эти части по отдельности.