Files и Path API

Тема дорожной карты · Java

Файловый ввод-вывод в Java охватывает все механизмы чтения и записи данных в файловую систему, сетевые потоки и буферы памяти через многоуровневые абстракции в java.io и современном пакете java.nio.file. Классический API java.io строится вокруг байтовых потоков (FileInputStream, FileOutputStream) и символьных потоков (FileReader, FileWriter, BufferedReader, PrintWriter), все из которых реализуют Closeable и должны управляться через try-with-resources для предотвращения утечек файловых дескрипторов. API NIO.2 (java.nio.file), доступный начиная с Java 7, вводит интерфейс Path и утилитный класс Files с однострочными операциями: Files.readAllBytes(path), Files.writeString(path, content, StandardOpenOption.APPEND), Files.walk(dir) для рекурсивного обхода каталогов и Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING). Производительность файлового ввода-вывода Java значительно возрастает при использовании буферизованных обёрток — обёртывание FileInputStream в BufferedInputStream снижает частоту системных вызовов с одного на байт до одного на заполнение буфера, а NIO-каналы с ByteBuffer (или файлы, отображаемые в память через FileChannel.map()) обеспечивают ещё более высокую пропускную способность для обработки больших файлов. Сериализация — запись графов Java-объектов в потоки через ObjectOutputStream и их восстановление через ObjectInputStream — это ещё один аспект файлового ввода-вывода Java, хотя современные приложения предпочитают структурированные форматы, такие как JSON (Jackson) или Protocol Buffers, нативной Java Serialization по соображениям переносимости и безопасности.

Как это работает

Files и Path API имеет java.io (legacy блокирующие потоки: InputStream, OutputStream, Reader, Writer) и java.nio (современные channels + buffers, non-blocking, Path API). Для file I/O предпочитайте NIO Path API (Files.readString(path), Files.write(path, content), Files.lines(path).forEach(...)). Для сетевых сокетов NIO Channels + Selectors дают non-blocking I/O на масштабе. Async file I/O — через AsynchronousFileChannel. HTTP-клиент (java.net.http.HttpClient, с 11) reactive-aware.

Когда применять

Для файлов — всегда Files.*-методы: лаконично, современно, по дефолту UTF-8. Для HTTP — java.net.http.HttpClient лучше Apache HttpClient или legacy HttpURLConnection. Для сетевых серверов фреймворки (Netty, Vert.x) абстрагируют NIO. Reader/Writer — для текста, InputStream/OutputStream — для бинаря; всегда указывайте charset (StandardCharsets.UTF_8).

Типичные ошибки

Ловушки Files и Path API: не закрытые streams (ресурсная утечка — try-with-resources); platform-default charset (Windows тихо cp1252); чтение огромных файлов через readAllBytes (OOM — стримите); блокирующий I/O на main-thread однопоточного app-сервера (UI замораживается / latency запросов растёт).

Связанные понятия

Полезные ресурсы