Gymterview
middle

Какие классы поддерживают чтение и запись потоков в компрессированном формате?

Java предоставляет классы для работы со сжатыми данными в пакете java.util.zip. Они реализованы как потоки-обёртки (паттерн Декоратор) и поддерживают три формата сжатия.

Формат ZIP

Класс Назначение
ZipOutputStream Запись данных в формате ZIP (поддерживает множество файлов в одном архиве)
ZipInputStream Чтение данных из формата ZIP

Формат GZIP

Класс Назначение
GZIPOutputStream Сжатие потока в формате GZIP (один файл/поток)
GZIPInputStream Распаковка потока из формата GZIP

Формат Deflate (низкоуровневый)

Класс Назначение
DeflaterOutputStream Сжатие данных алгоритмом deflate
InflaterInputStream Распаковка данных алгоритмом deflate
Deflater Низкоуровневое сжатие в формате ZLIB
Inflater Низкоуровневая распаковка из формата ZLIB

ZipOutputStream и GZIPOutputStream наследуют DeflaterOutputStream, а ZipInputStream и GZIPInputStreamInflaterInputStream.

Пример: создание GZIP-архива

Пример
try (GZIPOutputStream gzip = new GZIPOutputStream(
        new FileOutputStream("data.txt.gz"))) {
    Files.copy(Path.of("data.txt"), gzip);
}

ZIP используется для архивирования нескольких файлов, GZIP — для сжатия одного потока данных (типичен в HTTP: заголовок Content-Encoding: gzip). В серверных приложениях GZIPOutputStream часто оборачивает HTTP-ответ для уменьшения трафика.

На собеседовании: назовите ZIP, GZIP и Deflate классы. Подчеркните, что ZIP — для архивов (несколько файлов), GZIP — для потоков (один файл). Упомяните их использование в HTTP-сжатии.