Spec-Zone.ru › OpenJDK 24

Класс Deflater

java.lang.Object
java.util.zip.Deflater
public class Deflater extends Object
Этот класс предоставляет поддержку сжатия общего назначения, используя популярную библиотеку сжатия ZLIB. Библиотека сжатия ZLIB была первоначально разработана как часть стандарта графики PNG и не защищена патентами. Она полностью описана в спецификациях в описании пакета java.util.zip.

Если не указано иное, передача null аргумента методу в этом классе приведёт к исключению NullPointerException.

Этот класс сжимает последовательности байтов в сжатый формат данных ZLIB. Последовательность входных байтов предоставляется в массиве байтов или буфере байтов, через один из методов setInput(). Выходная последовательность байтов записывается в выходной массив байтов или буфер байтов, переданный методам deflate().

Следующий фрагмент кода демонстрирует тривиальное сжатие и распаковку строки, используя 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();
Deflater compressor = new Deflater();
try {
    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);
    }
} finally {
    // Release the resources held by the compressor
    compressor.end();
}

// Decompress the bytes
Inflater decompressor = new Inflater();
ByteArrayOutputStream decompressedBaos = new ByteArrayOutputStream();
try {
    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);
    }
} finally {
    // Release the resources held by the decompressor
    decompressor.end();
}
// Decode the bytes into a String
String outputString = decompressedBaos.toString(StandardCharsets.UTF_8);

API Note:
Для освобождения ресурсов, используемых этим Deflater, необходимо явно вызвать метод end(). Подклассы несут ответственность за очистку ресурсов, полученных подклассом. Подклассы, переопределяющие Object.finalize() для выполнения очистки, должны быть изменены на использование альтернативных механизмов очистки, таких как Cleaner, и удалить переопределённый finalize метод.
Since:
1.1
См. также:
  • Inflater

Краткое описание полей

Модификатор и тип Поле Описание
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(int level)
Создаёт новый сжиматель с указанным уровнем сжатия.
Deflater(int level, boolean nowrap)
Создаёт новый сжиматель с указанным уровнем сжатия.

Краткое описание методов

Модификатор и тип Метод Описание
int deflate(byte[] output)
Сжимает входные данные и заполняет указанный буфер сжатыми данными.
int deflate(byte[] output, int off, int len)
Сжимает входные данные и заполняет указанный буфер сжатыми данными.
int deflate(byte[] output, int off, int len, int flush)
Сжимает входные данные и заполняет указанный буфер сжатыми данными.
int deflate(ByteBuffer output)
Сжимает входные данные и заполняет указанный буфер сжатыми данными.
int deflate(ByteBuffer output, int flush)
Сжимает входные данные и заполняет указанный буфер сжатыми данными.
void end()
Закрывает сжиматель и отбрасывает любые необработанные входные данные.
void finish()
При вызове указывает, что сжатие должно завершиться текущим содержимым буфера ввода.
boolean finished()
Возвращает true, если достигнут конец потока выходных данных сжатых данных.
int getAdler()
Возвращает значение ADLER-32 несжатых данных.
long getBytesRead()
Возвращает общее количество несжатых байтов, введённых до сих пор.
long getBytesWritten()
Возвращает общее количество сжатых байтов, выведенных до сих пор.
int getTotalIn()
Устарело.
Используйте getBytesRead() вместо этого
int getTotalOut()
Устарело.
Используйте getBytesWritten() вместо этого
boolean needsInput()
Возвращает true, если в буфере ввода больше нет данных.
void reset()
Сбрасывает сжиматель, чтобы можно было обработать новый набор входных данных.
void setDictionary(byte[] dictionary)
Устанавливает предопределённый словарь для сжатия.
void setDictionary(byte[] dictionary, int off, int len)
Устанавливает предопределённый словарь для сжатия.
void setDictionary(ByteBuffer dictionary)
Устанавливает предопределённый словарь для сжатия.
void setInput(byte[] input)
Устанавливает входные данные для сжатия.
void setInput(byte[] input, int off, int len)
Устанавливает входные данные для сжатия.
void setInput(ByteBuffer input)
Устанавливает входные данные для сжатия.
void setLevel(int level)
Устанавливает уровень сжатия на указанное значение.
void setStrategy(int strategy)
Устанавливает стратегию сжатия на указанное значение.

Методы, объявленные в классе java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание полей

DEFLATED

public static final int DEFLATED
Метод сжатия для алгоритма deflate (единственный в настоящее время поддерживаемый).
См. также:
  • Значения константных полей

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
См. также:
  • deflate(byte[], int, int, int)
  • Значения константных полей

SYNC_FLUSH

public static final int SYNC_FLUSH
Режим сброса сжатия, используемый для сброса всех ожидающих выходов; может ухудшить сжатие для некоторых алгоритмов сжатия.
С:
1.7
См. также:
  • deflate(byte[], int, int, int)
  • Значения константных полей

FULL_FLUSH

public static final int FULL_FLUSH
Режим сброса сжатия, используемый для сброса всех ожидающих выходов и сброса сжимателя. Чрезмерное использование этого режима может серьезно ухудшить сжатие.
С:
1.7
См. также:
  • deflate(byte[], int, int, int)
  • Значения константных полей

Подробное описание конструкторов

Deflater

public Deflater(int level, boolean nowrap)
Создаёт новый сжиматель, используя указанный уровень сжатия. Если 'nowrap' равно true, то поля заголовка и контрольной суммы ZLIB не будут использоваться, чтобы поддерживать формат сжатия, используемый как в GZIP, так и в PKZIP.
Параметры:
level - уровень сжатия (0-9)
nowrap - если true, то использовать сжатие совместимое с GZIP

Deflater

public Deflater(int level)
Создаёт новый сжиматель, используя указанный уровень сжатия. Сжатые данные будут генерироваться в формате ZLIB.
Параметры:
level - уровень сжатия (0-9)

Deflater

public Deflater()
Создаёт новый сжиматель с уровнем сжатия по умолчанию. Сжатые данные будут генерироваться в формате ZLIB.

Подробное описание методов

setInput

public void setInput(byte[] input, int off, int len)
Устанавливает входные данные для сжатия.

Один из методов setInput() должен быть вызван всякий раз, когда needsInput() возвращает true, указывая, что требуются дополнительные входные данные.

Параметры:
input - байты входных данных
off - начальный смещение данных
len - длина данных
См. также:
  • needsInput()

setInput

public void setInput(byte[] input)
Устанавливает входные данные для сжатия.

Один из методов setInput() должен быть вызван всякий раз, когда needsInput() возвращает true, указывая, что требуются дополнительные входные данные.

Параметры:
input - байты входных данных
См. также:
  • needsInput()

setInput

public void setInput(ByteBuffer input)
Устанавливает входные данные для сжатия.

Один из методов setInput() должен быть вызван всякий раз, когда needsInput() возвращает true, указывая, что требуются дополнительные входные данные.

Позиция заданного буфера будет перемещаться по мере выполнения операций сжатия, до предела буфера. Входной буфер может быть изменён (дополнен) между операциями сжатия; это эквивалентно созданию нового буфера и установке его с помощью этого метода.

Изменение содержимого, позиции или предела входного буфера во время операции сжатия приведёт к неопределённому поведению, которое может включать неверные результаты операций или их сбой.

Параметры:
input - байты входных данных
С:
11
См. также:
  • needsInput()

setDictionary

public void setDictionary(byte[] dictionary, int off, int len)
Устанавливает предопределённый словарь для сжатия. Предопределённый словарь используется, когда буфер истории может быть предварительно определён. Когда данные впоследствии распаковываются с помощью Inflater.inflate(), Inflater.getAdler() может быть вызван для получения значения Adler-32 словаря, необходимого для распаковки.
Параметры:
dictionary - байты данных словаря
off - начальный смещение данных
len - длина данных
См. также:
  • Inflater.inflate(byte[], int, int)
  • Inflater.getAdler()

setDictionary

public void setDictionary(byte[] dictionary)
Устанавливает предопределённый словарь для сжатия. Предопределённый словарь используется, когда буфер истории может быть предварительно определён. Когда данные впоследствии распаковываются с помощью Inflater.inflate(), Inflater.getAdler() может быть вызван для получения значения Adler-32 словаря, необходимого для распаковки.
Параметры:
dictionary - байты данных словаря
См. также:
  • Inflater.inflate(byte[], int, int)
  • Inflater.getAdler()

Установка словаря

public void setDictionary(ByteBuffer dictionary)
Устанавливает предварительно заданный словарь для сжатия. Предварительно заданный словарь используется, когда буфер истории может быть предопределён. Когда данные позже распаковываются с помощью Inflater.inflate(), Inflater.getAdler() можно вызвать, чтобы получить значение Adler-32 словаря, необходимого для распаковки.

Байты в данном буфере байтов будут полностью использованы этим методом. По возвращении его позиция будет равна его пределу.

Параметры:
dictionary - байты данных словаря
С:
11
См. также:
  • Inflater.inflate(byte[], int, int)
  • Inflater.getAdler()

Установка стратегии

public void setStrategy(int strategy)
Устанавливает стратегию сжатия в указанное значение.

Если стратегия сжатия изменена, следующий вызов deflate будет сжимать доступный на данный момент ввод со старой стратегией (и может быть сброшен); новая стратегия вступит в силу только после этого вызова.

Параметры:
strategy - новая стратегия сжатия
Исключения:
IllegalArgumentException - если стратегия сжатия неверна

Установить уровень

public void setLevel(int level)
Устанавливает уровень сжатия в указанное значение.

Если уровень сжатия изменён, следующий вызов deflate будет сжимать доступный на данный момент ввод со старым уровнем (и может быть сброшен); новый уровень вступит в силу только после этого вызова.

Параметры:
level - новый уровень сжатия (0-9)
Исключения:
IllegalArgumentException - если уровень сжатия неверен

нужны данные

public boolean needsInput()
Возвращает true, если в буфере ввода нет данных. Это можно использовать для определения, следует ли вызвать один из методов setInput(), чтобы предоставить больше ввода.
Возвращает:
true, если буфер данных ввода пуст и следует вызвать setInput(), чтобы предоставить больше ввода

завершить

public void finish()
При вызове указывает, что сжатие должно завершиться текущим содержимым буфера ввода.

закончено

public boolean finished()
Возвращает true, если достигнут конец сжатого потока данных.
Возвращает:
true, если достигнут конец сжатого потока данных

deflate

public int deflate(byte[] output, int off, int len)
Сжимает данные ввода и заполняет указанный буфер сжатыми данными. Возвращает фактическое количество байтов сжатых данных. Значение 0 указывает, что следует вызвать needsInput, чтобы определить, требуется ли дополнительный ввод данных.

Этот метод использует NO_FLUSH в качестве режима сброса сжатия. Вызов этого метода в форме deflater.deflate(b, off, len) даёт тот же результат, что и вызов deflater.deflate(b, off, len, Deflater.NO_FLUSH).

Параметры:
output - буфер для сжатых данных
off - начальный смещение данных
len - максимальное количество байтов сжатых данных
Возвращает:
фактическое количество байтов сжатых данных, записанных в буфер вывода

deflate

public int deflate(byte[] output)
Сжимает данные ввода и заполняет указанный буфер сжатыми данными. Возвращает фактическое количество байтов сжатых данных. Значение 0 указывает, что следует вызвать needsInput, чтобы определить, требуется ли дополнительный ввод данных.

Этот метод использует NO_FLUSH в качестве режима сброса сжатия. Вызов этого метода в форме deflater.deflate(b) даёт тот же результат, что и вызов deflater.deflate(b, 0, b.length, Deflater.NO_FLUSH).

Параметры:
output - буфер для сжатых данных
Возвращает:
фактическое количество байтов сжатых данных, записанных в буфер вывода

deflate

public int deflate(ByteBuffer output)
Сжимает данные ввода и заполняет указанный буфер сжатыми данными. Возвращает фактическое количество байтов сжатых данных. Значение 0 указывает, что следует вызвать needsInput, чтобы определить, требуется ли дополнительный ввод данных.

Этот метод использует NO_FLUSH в качестве режима сброса сжатия. Вызов этого метода в форме deflater.deflate(output) даёт тот же результат, что и вызов deflater.deflate(output, Deflater.NO_FLUSH).

Параметры:
output - буфер для сжатых данных
Возвращает:
фактическое количество байтов сжатых данных, записанных в буфер вывода
Исключения:
ReadOnlyBufferException - если данный буфер вывода только для чтения
С:
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 - если режим сброса неверный
С:
1.7

deflate

public int deflate(ByteBuffer output, int flush)
Сжимает входные данные и заполняет указанный буфер сжатыми данными. Возвращает фактическое количество сжатых байтов данных.

Режим сжатия flush один из следующих трех режимов:

  • NO_FLUSH: позволяет сжимающему устройству определить, сколько данных накопить перед созданием выходных данных, чтобы достичь наилучшего сжатия (должен использоваться в стандартных сценариях). Значение возврата 0 в этом режиме flush указывает на то, что необходимо вызвать needsInput(), чтобы определить, требуется ли дополнительный входной данные.
  • SYNC_FLUSH: все ожидающие выходные данные в сжимающем устройстве сбрасываются в указанный буфер вывода, чтобы декомпрессор, работающий со сжатыми данными, мог получить все доступные входные данные до сих пор (в частности, needsInput() возвращает true после этого вызова, если предоставлен достаточный объем места в буфере вывода). Сброс с SYNC_FLUSH может ухудшить сжатие для некоторых алгоритмов сжатия, поэтому его следует использовать только при необходимости.
  • FULL_FLUSH: все ожидающие выходные данные сбрасываются, как и с SYNC_FLUSH. Состояние сжатия сбрасывается, чтобы декомпрессор, работающий со сжатыми выходными данными, мог перезапустить обработку с этой точки, если предыдущие сжатые данные были повреждены или если требуется произвольный доступ. Чрезмерное использование FULL_FLUSH может серьезно ухудшить сжатие.

В случае FULL_FLUSH или SYNC_FLUSH, если возвращаемое значение равно оставшемуся объему буфера, этот метод следует вызвать снова с тем же параметром flush и большим объемом места в буфере вывода. Убедитесь, что буфер имеет как минимум 6 байтов свободного места, чтобы избежать повторяющегося вывода маркера сброса (5 байтов) в буфер вывода при каждом вызове этого метода.

При успешном выполнении позиция заданного output байтового буфера будет продвинута на количество байтов, произведённых операцией, которое равно возвращаемому значению этого метода.

Если метод setInput(ByteBuffer) был вызван для предоставления буфера для ввода, позиция буфера ввода будет продвинута на количество потреблённых байтов этой операцией.

Parameters:
output - буфер для сжатых данных
flush - режим сброса сжатия
Returns:
фактическое количество байтов сжатых данных, записанных в буфер вывода
Throws:
IllegalArgumentException - если режим сброса некорректен
ReadOnlyBufferException - если заданный буфер вывода только для чтения
Since:
11

getAdler

public int getAdler()
Возвращает значение ADLER-32 нескомпрессированных данных.
Returns:
значение ADLER-32 нескомпрессированных данных

getTotalIn

@Deprecated(since="23") public int getTotalIn()
Устаревшее.
Используйте getBytesRead() вместо этого
Возвращает общее количество нескомпрессированных байтов, введённых до сих пор.
Требования к реализации:
Этот метод возвращает эквивалент (int) getBytesRead() и поэтому не может вернуть корректное значение, если оно больше Integer.MAX_VALUE.
Returns:
общее количество нескомпрессированных байтов, введённых до сих пор

getBytesRead

public long getBytesRead()
Возвращает общее количество нескомпрессированных байтов, введённых до сих пор.
Returns:
общее (неотрицательное) количество нескомпрессированных байтов, введённых до сих пор
Since:
1.5

getTotalOut

@Deprecated(since="23") public int getTotalOut()
Устаревшее.
Используйте getBytesWritten() вместо этого
Возвращает общее количество сжатых байтов, выведенных до сих пор.
Требования к реализации:
Этот метод возвращает эквивалент (int) getBytesWritten() и поэтому не может вернуть корректное значение, если оно больше Integer.MAX_VALUE.
Returns:
общее количество сжатых байтов, выведенных до сих пор

getBytesWritten

public long getBytesWritten()
Возвращает общее количество сжатых байтов, выведенных до сих пор.
Returns:
общее (неотрицательное) количество сжатых байтов, выведенных до сих пор
Since:
1.5

reset

public void reset()
Сбрасывает сжимающее устройство, чтобы можно было обработать новый набор входных данных. Сохраняет текущий уровень сжатия и настройки стратегии.

end

public void end()
Закрывает сжимающее устройство и отбрасывает любые необработанные входные данные. Этот метод следует вызывать, когда сжимающее устройство больше не используется. После вызова этого метода поведение объекта Deflater не определено.

© 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/zip/Deflater.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API