Класс Deflater
- Все реализуемые интерфейсы:
AutoCloseable
public class Deflater extends Object implements AutoCloseable
Если не указано иное, передача аргумента null методу этого класса приведет к выбросу исключения NullPointerException.
Этот класс преобразует последовательности байтов в сжатый формат данных ZLIB. Входная последовательность байтов передается либо в массиве байтов, либо в ByteBuffer через один из методов setInput(). Выходная последовательность байтов записывается в выходной массив байтов или ByteBuffer, переданный методам deflate().
Чтобы освободить ресурсы, используемые Deflater, приложение должно закрыть его, вызвав метод end() или close().
- Примечание к API:
- Этот класс реализует интерфейс
AutoCloseable, чтобы упростить его использование в оператореtry-with-resources. Метод close() просто вызываетend().Следующий фрагмент кода демонстрирует простое сжатие и распаковку строки с использованием
DeflaterиInflater.// Encode a String into bytes String inputString = "blahblahblah\u20AC\u20AC"; byte[] input = inputString.getBytes(StandardCharsets.UTF_8); // Compress the bytes ByteArrayOutputStream compressedBaos = new ByteArrayOutputStream(); try (Deflater compressor = new Deflater()) { compressor.setInput(input); // Let the compressor know that the complete input // has been made available compressor.finish(); // Keep compressing the input till the compressor // is finished compressing while (!compressor.finished()) { // Use some reasonable size for the temporary buffer // based on the data being compressed byte[] tmpBuffer = new byte[100]; int numCompressed = compressor.deflate(tmpBuffer); // Copy over the compressed bytes from the temporary // buffer into the final byte array compressedBaos.write(tmpBuffer, 0, numCompressed); } } // Decompress the bytes ByteArrayOutputStream decompressedBaos = new ByteArrayOutputStream(); try (Inflater decompressor = new Inflater()) { byte[] compressed = compressedBaos.toByteArray(); decompressor.setInput(compressed, 0, compressed.length); while (!decompressor.finished()) { // Use some reasonable size for the temporary buffer, // based on the data being decompressed; in this example, // we use a small buffer size byte[] tmpBuffer = new byte[100]; int numDecompressed = 0; try { numDecompressed = decompressor.inflate(tmpBuffer); } catch (DataFormatException dfe) { // Handle the exception suitably, in this example // we just rethrow it throw new RuntimeException(dfe); } // Copy over the decompressed bytes from the temporary // buffer into the final byte array decompressedBaos.write(tmpBuffer, 0, numDecompressed); } } // Decode the bytes into a String String outputString = decompressedBaos.toString(StandardCharsets.UTF_8); - Начиная с версии:
- 1.1
- См. также:
Краткое описание полей
| Модификатор и тип | Поле | Описание |
|---|---|---|
static final int |
BEST_COMPRESSION |
Уровень сжатия для наилучшего сжатия. |
static final int |
BEST_SPEED |
Уровень сжатия для максимально быстрого сжатия. |
static final int |
DEFAULT_COMPRESSION |
Уровень сжатия по умолчанию. |
static final int |
DEFAULT_STRATEGY |
Стратегия сжатия по умолчанию. |
static final int |
DEFLATED |
Метод сжатия для алгоритма deflate (единственный поддерживаемый в настоящее время). |
static final int |
FILTERED |
Стратегия сжатия, наиболее подходящая для данных, состоящих преимущественно из небольших значений со случайным распределением. |
static final int |
FULL_FLUSH |
Режим сброса данных сжатия, используемый для сброса всех ожидающих выходных данных и сброса состояния дефлятора. |
static final int |
HUFFMAN_ONLY |
Стратегия сжатия только для кодирования Хаффмана. |
static final int |
NO_COMPRESSION |
Уровень сжатия без сжатия. |
static final int |
NO_FLUSH |
Режим сброса данных сжатия, используемый для достижения наилучшего результата сжатия. |
static final int |
SYNC_FLUSH |
Режим сброса данных сжатия, используемый для сброса всех ожидающих выходных данных; может ухудшить сжатие для некоторых алгоритмов сжатия. |
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
Deflater() |
Создает новый компрессор с уровнем сжатия по умолчанию. |
Deflater |
Создает новый компрессор с указанным уровнем сжатия. |
Deflater |
Создает новый компрессор с указанным уровнем сжатия. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
close() |
Закрывает и освобождает ресурсы, используемые этим Deflater, и удаляет все необработанные входные данные. |
int |
deflate |
Сжимает входные данные и заполняет указанный буфер сжатыми данными. |
int |
deflate |
Сжимает входные данные и заполняет указанный буфер сжатыми данными. |
int |
deflate |
Сжимает входные данные и заполняет указанный буфер сжатыми данными. |
int |
deflate |
Сжимает входные данные и заполняет указанный буфер сжатыми данными. |
int |
deflate |
Сжимает входные данные и заполняет указанный буфер сжатыми данными. |
void |
end() |
Закрывает и освобождает ресурсы, используемые этим Deflater, и удаляет все необработанные входные данные. |
void |
finish() |
При вызове указывает, что сжатие должно завершиться с текущим содержимым входного буфера. |
boolean |
finished() |
Возвращает true, если достигнут конец потока выходных сжатых данных. |
int |
getAdler() |
Возвращает значение ADLER-32 для несжатых данных. |
long |
getBytesRead() |
Возвращает общее количество байтов несжатых входных данных на данный момент. |
long |
getBytesWritten() |
Возвращает общее количество байтов сжатых выходных данных на данный момент. |
int |
getTotalIn() |
Устарел. |
int |
getTotalOut() |
Устарел. Вместо него используйте getBytesWritten() |
boolean |
needsInput() |
Возвращает true, если во входном буфере не осталось данных. |
void |
reset() |
Сбрасывает состояние дефлятора, чтобы можно было обработать новый набор входных данных. |
void |
setDictionary |
Задает предустановленный словарь для сжатия. |
void |
setDictionary |
Задает предустановленный словарь для сжатия. |
void |
setDictionary |
Задает предустановленный словарь для сжатия. |
void |
setInput |
Задает входные данные для сжатия. |
void |
setInput |
Задает входные данные для сжатия. |
void |
setInput |
Задает входные данные для сжатия. |
void |
setLevel |
Задает указанный уровень сжатия. |
void |
setStrategy |
Задает указанную стратегию сжатия. |
Подробное описание полей
DEFLATED
public static final int DEFLATED
- См. также:
NO_COMPRESSION
public static final int NO_COMPRESSION
- См. также:
BEST_SPEED
public static final int BEST_SPEED
- См. также:
BEST_COMPRESSION
public static final int BEST_COMPRESSION
- См. также:
DEFAULT_COMPRESSION
public static final int DEFAULT_COMPRESSION
- См. также:
FILTERED
public static final int FILTERED
- См. также:
HUFFMAN_ONLY
public static final int HUFFMAN_ONLY
- См. также:
DEFAULT_STRATEGY
public static final int DEFAULT_STRATEGY
- См. также:
NO_FLUSH
public static final int NO_FLUSH
- Начиная с:
- 1.7
- См. также:
SYNC_FLUSH
public static final int SYNC_FLUSH
- Начиная с:
- 1.7
- См. также:
FULL_FLUSH
public static final int FULL_FLUSH
- Начиная с:
- 1.7
- См. также:
Подробное описание конструкторов
Deflater
public Deflater(int level, boolean nowrap)
- Параметры:
-
level— уровень сжатия (0–9) -
nowrap— если true, используется сжатие, совместимое с GZIP
Deflater
public Deflater(int level)
- Параметры:
-
level— уровень сжатия (0–9)
Deflater
public Deflater()
Подробное описание методов
setInput
public void setInput(byte[] input, int off, int len)
Один из методов setInput() следует вызывать каждый раз, когда needsInput() возвращает true, указывая на необходимость дополнительных входных данных.
- Параметры:
-
input— байты входных данных -
off— начальное смещение данных -
len— длина данных - См. также:
setInput
public void setInput(byte[] input)
Один из методов setInput() следует вызывать каждый раз, когда needsInput() возвращает true, указывая на необходимость дополнительных входных данных.
- Параметры:
-
input— байты входных данных - См. также:
setInput
public void setInput(ByteBuffer input)
Один из методов setInput() следует вызывать каждый раз, когда needsInput() возвращает true, указывая на необходимость дополнительных входных данных.
По мере выполнения операций сжатия позиция заданного буфера будет увеличиваться вплоть до его предельного значения. Входной буфер можно изменять (повторно заполнять) между операциями сжатия; это равносильно созданию нового буфера и его заданию с помощью этого метода.
Одновременное изменение содержимого, позиции или предельного значения входного буфера во время операции сжатия приводит к неопределённому поведению, которое может включать некорректные результаты операции или её сбой.
- Параметры:
-
input— байты входных данных - Начиная с:
- 11
- См. также:
setDictionary
public void setDictionary(byte[] dictionary, int off, int len)
- Параметры:
-
dictionary— байты данных словаря -
off— начальное смещение данных -
len— длина данных - Исключения:
-
IllegalStateException— если Deflater закрыт - См. также:
setDictionary
public void setDictionary(byte[] dictionary)
- Параметры:
-
dictionary— байты данных словаря - Исключения:
-
IllegalStateException— если Deflater закрыт - См. также:
setDictionary
public void setDictionary(ByteBuffer dictionary)
Этот метод полностью считывает байты из заданного байтового буфера. После возврата позиция буфера будет равна его предельному значению.
- Параметры:
-
dictionary— байты данных словаря - Исключения:
-
IllegalStateException— если Deflater закрыт - Начиная с:
- 11
- См. также:
setStrategy
public void setStrategy(int strategy)
Если стратегия сжатия изменена, при следующем вызове deflate входные данные, доступные на данный момент, будут сжаты с использованием старой стратегии (и, возможно, сброшены); новая стратегия вступит в силу только после этого вызова.
- Параметры:
-
strategy— новая стратегия сжатия - Исключения:
-
IllegalArgumentException— если стратегия сжатия недопустима
setLevel
public void setLevel(int level)
Если уровень сжатия изменён, при следующем вызове deflate входные данные, доступные на данный момент, будут сжаты с использованием старого уровня (и, возможно, сброшены); новый уровень вступит в силу только после этого вызова.
- Параметры:
-
level— новый уровень сжатия (0–9) - Исключения:
-
IllegalArgumentException— если уровень сжатия недопустим
needsInput
public boolean needsInput()
setInput() для предоставления дополнительных входных данных.- Возвращает:
- true, если буфер входных данных пуст и для предоставления дополнительных данных следует вызвать setInput()
finish
public void finish()
finished
public boolean finished()
- Возвращает:
- true, если достигнут конец выходного потока сжатых данных
deflate
public int deflate(byte[] output, int off, int len)
needsInput, чтобы определить, требуются ли дополнительные входные данные. Этот метод использует NO_FLUSH в качестве режима сброса при сжатии. Вызов этого метода в форме deflater.deflate(b, off, len) даёт тот же результат, что и вызов deflater.deflate(b, off, len, Deflater.NO_FLUSH).
- Параметры:
-
output— буфер для сжатых данных -
off— начальное смещение данных -
len— максимальное количество байтов сжатых данных - Возвращает:
- фактическое количество байтов сжатых данных, записанных в выходной буфер
- Исключения:
-
IllegalStateException— если Deflater закрыт
deflate
public int deflate(byte[] output)
needsInput, чтобы определить, требуются ли дополнительные входные данные. Этот метод использует NO_FLUSH в качестве режима сброса при сжатии. Вызов этого метода в форме deflater.deflate(b) даёт тот же результат, что и вызов deflater.deflate(b, 0, b.length, Deflater.NO_FLUSH).
- Параметры:
-
output— буфер для сжатых данных - Возвращает:
- фактическое количество байтов сжатых данных, записанных в выходной буфер
- Исключения:
-
IllegalStateException— если Deflater закрыт
deflate
public int deflate(ByteBuffer output)
needsInput, чтобы определить, требуются ли дополнительные входные данные. Этот метод использует NO_FLUSH в качестве режима сброса при сжатии. Вызов этого метода в форме deflater.deflate(output) даёт тот же результат, что и вызов deflater.deflate(output, Deflater.NO_FLUSH).
- Параметры:
-
output— буфер для сжатых данных - Возвращает:
- фактическое количество байтов сжатых данных, записанных в выходной буфер
- Исключения:
-
ReadOnlyBufferException— если заданный выходной буфер доступен только для чтения -
IllegalStateException— если Deflater закрыт - Начиная с:
- 11
deflate
public int deflate(byte[] output, int off, int len, int flush)
Режим сброса при сжатии — один из следующих трёх режимов:
-
NO_FLUSH: позволяет компрессору самостоятельно определить, сколько данных накопить перед созданием выходных данных, чтобы добиться наилучшего сжатия (рекомендуется для обычных сценариев использования). Возвращаемое значение 0 в этом режиме сброса указывает на то, что следует вызватьneedsInput(), чтобы определить, требуются ли дополнительные входные данные. -
SYNC_FLUSH: все ожидающие выходные данные компрессора сбрасываются в указанный выходной буфер, чтобы декомпрессор, обрабатывающий сжатые данные, мог получить все доступные на данный момент входные данные (в частности, после этого вызоваneedsInput()возвращаетtrue, если предоставлено достаточно места для выходных данных). Сброс с помощьюSYNC_FLUSHможет ухудшить сжатие для некоторых алгоритмов сжатия, поэтому его следует использовать только при необходимости. -
FULL_FLUSH: все ожидающие выходные данные сбрасываются, как и при использованииSYNC_FLUSH. Состояние сжатия сбрасывается, чтобы декомпрессор, обрабатывающий сжатые выходные данные, мог начать работу с этой точки, если предыдущие сжатые данные были повреждены или требуется произвольный доступ. Слишком частое использованиеFULL_FLUSHможет серьёзно ухудшить сжатие.
В случае использования FULL_FLUSH или SYNC_FLUSH, если возвращаемое значение равно len, в выходном буфере b доступное пространство, этот метод следует вызвать повторно с тем же параметром flush и большим объёмом выходного пространства. Убедитесь, что значение len больше 6, чтобы маркер сброса (5 байтов) не записывался повторно в выходной буфер при каждом вызове этого метода.
Если для задания входного буфера был вызван метод setInput(ByteBuffer), позиция входного буфера будет увеличена на количество байтов, использованных этой операцией.
- Параметры:
-
output— буфер для сжатых данных -
off— начальное смещение данных -
len— максимальное количество байтов сжатых данных -
flush— режим сброса при сжатии - Возвращает:
- фактическое количество байтов сжатых данных, записанных в выходной буфер
- Исключения:
-
IllegalArgumentException— если режим сброса недопустим -
IllegalStateException— если Deflater закрыт - Начиная с:
- 1.7
deflate
public int deflate(ByteBuffer output, int flush)
Режим сброса при сжатии — один из следующих трёх режимов:
-
NO_FLUSH: позволяет компрессору самостоятельно определить, сколько данных накопить перед созданием выходных данных, чтобы добиться наилучшего сжатия (рекомендуется для обычных сценариев использования). Возвращаемое значение 0 в этом режиме сброса указывает на то, что следует вызватьneedsInput(), чтобы определить, требуются ли дополнительные входные данные. -
SYNC_FLUSH: все ожидающие выходные данные компрессора сбрасываются в указанный выходной буфер, чтобы декомпрессор, обрабатывающий сжатые данные, мог получить все доступные на данный момент входные данные (в частности, после этого вызоваneedsInput()возвращаетtrue, если предоставлено достаточно места для выходных данных). Сброс с помощьюSYNC_FLUSHможет ухудшить сжатие для некоторых алгоритмов сжатия, поэтому его следует использовать только при необходимости. -
FULL_FLUSH: все ожидающие выходные данные сбрасываются, как и при использованииSYNC_FLUSH. Состояние сжатия сбрасывается, чтобы декомпрессор, обрабатывающий сжатые выходные данные, мог начать работу с этой точки, если предыдущие сжатые данные были повреждены или требуется произвольный доступ. Слишком частое использованиеFULL_FLUSHможет серьёзно ухудшить сжатие.
В случае использования FULL_FLUSH или SYNC_FLUSH, если возвращаемое значение равно оставшемуся пространству буфера, этот метод следует вызвать повторно с тем же параметром flush и большим объёмом выходного пространства. Убедитесь, что в буфере осталось не менее 6 байтов, чтобы маркер сброса (5 байтов) не записывался повторно в выходной буфер при каждом вызове этого метода.
В случае успеха позиция заданного байтового буфера output будет увеличена на количество байтов, созданных операцией, равное значению, возвращённому этим методом.
Если для задания входного буфера был вызван метод setInput(ByteBuffer), позиция входного буфера будет увеличена на количество байтов, использованных этой операцией.
- Параметры:
-
output— буфер для сжатых данных -
flush— режим сброса при сжатии - Возвращает:
- фактическое количество байтов сжатых данных, записанных в выходной буфер
- Исключения:
-
IllegalArgumentException— если режим сброса недопустим -
ReadOnlyBufferException— если заданный выходной буфер доступен только для чтения -
IllegalStateException— если Deflater закрыт - Начиная с:
- 11
getAdler
public int getAdler()
- Возвращает:
- значение ADLER-32 несжатых данных
- Исключения:
-
IllegalStateException— если Deflater закрыт
getTotalIn
@Deprecated(since="23") public int getTotalIn()
getBytesRead()- Требования к реализации:
- Этот метод возвращает значение, эквивалентное
(int) getBytesRead(), поэтому не может возвращать правильное значение, если оно превышаетInteger.MAX_VALUE. - Возвращает:
- общее количество обработанных на данный момент несжатых байтов
- Исключения:
-
IllegalStateException— если Deflater закрыт
getBytesRead
public long getBytesRead()
- Возвращает:
- общее (неотрицательное) количество обработанных на данный момент несжатых байтов
- Исключения:
-
IllegalStateException— если Deflater закрыт - Начиная с:
- 1.5
getTotalOut
@Deprecated(since="23") public int getTotalOut()
getBytesWritten()- Требования к реализации:
- Этот метод возвращает значение, эквивалентное
(int) getBytesWritten(), поэтому не может возвращать правильное значение, если оно превышаетInteger.MAX_VALUE. - Возвращает:
- общее количество выведенных на данный момент сжатых байтов
- Исключения:
-
IllegalStateException— если Deflater закрыт
getBytesWritten
public long getBytesWritten()
- Возвращает:
- общее (неотрицательное) количество выведенных на данный момент сжатых байтов
- Исключения:
-
IllegalStateException— если Deflater закрыт - Начиная с:
- 1.5
reset
public void reset()
- Исключения:
-
IllegalStateException— если Deflater закрыт
end
public void end()
Deflater, освобождает удерживаемые им ресурсы и отбрасывает все необработанные входные данные. Если Deflater уже закрыт, вызов этого метода не оказывает никакого эффекта.
- Требования к реализации:
- Подклассы должны переопределять этот метод для очистки ресурсов, полученных подклассом.
- См. также:
close
public void close()
Deflater, освобождает удерживаемые им ресурсы и отбрасывает все необработанные входные данные.- Определено в:
-
closeв интерфейсеAutoCloseable - Требования к реализации:
- Этот метод вызывает метод
end(). - Начиная с:
- 25
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/zip/Deflater.html
getBytesRead()