IO и NIO
Как данные попадают в программу и выходят из неё
Программа редко живёт только в оперативной памяти. Она читает конфигурацию, сохраняет файлы,
принимает байты из внешних источников и записывает результаты обратно.
В 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);
Эти две строки выглядят просто, но за ними уже стоят путь, файловая система, чтение данных и освобождение системных ресурсов. Дальше разберём эти части по отдельности.