Input/Output streams
Тема дорожной карты · Java
Потоки ввода-вывода в Java — это пакеты java.io и java.nio, предоставляющие фундаментальные API для чтения и записи данных между JVM-приложением и внешними источниками, такими как файлы, сетевые сокеты, буферы памяти и стандартный ввод-вывод. Классический API java.io построен вокруг двух абстрактных иерархий: InputStream/OutputStream для байт-ориентированного I/O и Reader/Writer для символьного I/O, с декорированными реализациями BufferedInputStream, BufferedReader, PrintWriter, DataOutputStream и ObjectOutputStream, добавляющими возможности буферизации, кодирования и Java Serialization. Пакет java.nio.file (NIO.2, введённый в Java 7) предоставляет утилитные классы Files и Paths с методами Files.readAllBytes(), Files.lines() (возвращающим Stream<String> для обработки в Stream API), Files.copy() и Files.walk(), значительно упрощающими типичные задачи с файлами по сравнению с устаревшим java.io.File. Потоки ввода-вывода в Java также охватывают java.nio.channels с FileChannel, SocketChannel и ByteBuffer для неблокирующих NIO-операций, файлов, отображённых в память, и scatter/gather-передач, критически важных для создания высокопроизводительных сетевых сервисов. Правильное управление ресурсами в потоках ввода-вывода Java требует try-with-resources для гарантии закрытия AutoCloseable-потоков и каналов, предотвращая утечки файловых дескрипторов и пулов соединений в долгоработающих JVM-процессах.
Как это работает
Input/Output streams имеет 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).
Типичные ошибки
Ловушки Input/Output streams: не закрытые streams (ресурсная утечка — try-with-resources); platform-default charset (Windows тихо cp1252); чтение огромных файлов через readAllBytes (OOM — стримите); блокирующий I/O на main-thread однопоточного app-сервера (UI замораживается / latency запросов растёт).