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 и GZIPInputStream — InflaterInputStream.
Пример: создание 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-сжатии.