Spec-Zone.ru › OpenJDK 24

Класс CharsetDecoder

java.lang.Object
java.nio.charset.CharsetDecoder
public abstract class CharsetDecoder extends Object
Двигатель, который может преобразовать последовательность байтов в определённой кодировке в последовательность символов Юникода в формате 16 бит.

Последовательность входных байтов предоставляется в буфере байтов или в серии таких буферов. Последовательность выходных символов записывается в буфер символов или в серии таких буферов. Декодер всегда должен использоваться, выполняя следующую последовательность вызовов методов, далее называемую *операцией декодирования*:

  1. Сбросить декодер с помощью метода reset, если он не использовался ранее;

  2. Вызвать метод decode ноль или более раз, пока доступны дополнительные входные данные, передавая false в качестве аргумента endOfInput и заполняя буфер ввода и очищая буфер вывода между вызовами;

  3. Вызвать метод decode один раз в заключение, передавая true в качестве аргумента endOfInput; и затем

  4. Вызвать метод flush, чтобы декодер мог очистить любое внутреннее состояние в буфер вывода.

Каждый вызов метода decode будет декодировать как можно больше байтов из входного буфера, записывая полученные символы в буфер вывода. Метод decode возвращает, когда требуется больше входных данных, когда в буфере вывода нет места или произошла ошибка декодирования. В каждом случае возвращается объект CoderResult, который описывает причину завершения. Вызывающий код может проверить этот объект, заполнить буфер ввода, очистить буфер вывода или попытаться восстановиться от ошибки декодирования, в зависимости от ситуации, и повторить попытку.

Существуют два основных типа ошибок декодирования. Если последовательность входных байтов не является допустимой для данной кодировки, то вход считается *неправильным*. Если последовательность входных байтов допустима, но не может быть отображена в допустимый символ Юникода, то встречен *неотображаемый символ*.

Обработка ошибки декодирования зависит от заданного действия для данного типа ошибки, которое описывается экземпляром класса CodingErrorAction. Возможные действия при ошибке: пропустить ошибочный вход, сообщить об ошибке вызывающему коду через возвращаемый объект CoderResult или заменить ошибочный вход текущим значением строки замены. Значение замены по умолчанию "\uFFFD"; его значение может быть изменено с помощью метода replaceWith.

По умолчанию действие для ошибок неправильного ввода и неотображаемых символов заключается в сообщении об них. Действие при ошибках неправильного ввода может быть изменено с помощью метода onMalformedInput; действие при ошибках неотображаемых символов может быть изменено с помощью метода onUnmappableCharacter.

Этот класс разработан для обработки многих деталей процесса декодирования, включая реализацию действий при ошибках. Декодер для определённой кодировки, который является конкретным подклассом этого класса, должен только реализовать абстрактный метод decodeLoop, который обобщает основной цикл декодирования. Подкласс, который поддерживает внутреннее состояние, должен дополнительно переопределить методы implFlush и implReset.

Экземпляры этого класса не являются потокобезопасными.

С:
1.4
См. также:
  • ByteBuffer
  • CharBuffer
  • Charset
  • CharsetEncoder

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

CharsetDecoder(Charset cs, float averageCharsPerByte, float maxCharsPerByte)
Модификатор Конструктор Описание
protected
Инициализирует новый декодер.

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

Модификатор и тип Метод Описание
final float averageCharsPerByte()
Возвращает среднее количество символов, которое будет произведено на каждый байт входных данных.
final Charset charset()
Возвращает кодировку, которая создала этот декодер.
final CharBuffer decode(ByteBuffer in)
Удобный метод, который декодирует оставшееся содержимое одного входного буфера байтов в новый буфер символов.
final CoderResult decode(ByteBuffer in, CharBuffer out, boolean endOfInput)
Декодирует как можно больше байтов из данного входного буфера, записывая результаты в данный буфер вывода.
protected abstract CoderResult decodeLoop(ByteBuffer in, CharBuffer out)
Декодирует один или более байтов в один или более символов.
Charset detectedCharset()
Возвращает кодировку, обнаруженную этим декодером (необязательная операция).
final CoderResult flush(CharBuffer out)
Очищает этот декодер.
protected CoderResult implFlush(CharBuffer out)
Очищает этот декодер.
protected void implOnMalformedInput(CodingErrorAction newAction)
Сообщает об изменении действия этого декодера для ошибок неправильного ввода.
protected void implOnUnmappableCharacter(CodingErrorAction newAction)
Сообщает об изменении действия этого декодера для ошибок неотображаемых символов.
protected void implReplaceWith(String newReplacement)
Сообщает об изменении значения замены этого декодера.
protected void implReset()
Сбрасывает этот декодер, очищая любое состояние, специфичное для кодировки.
boolean isAutoDetecting()
Указывает, реализует ли этот декодер автоматическое определение кодировки.
boolean isCharsetDetected()
Указывает, определил ли этот декодер кодировку (необязательная операция).
CodingErrorAction malformedInputAction()
Возвращает текущее действие этого декодера для ошибок неправильного ввода.
final float maxCharsPerByte()
Возвращает максимальное количество символов, которое будет произведено на каждый байт входных данных.
final CharsetDecoder onMalformedInput(CodingErrorAction newAction)
Изменяет действие этого декодера для ошибок неправильного ввода.
final CharsetDecoder onUnmappableCharacter(CodingErrorAction newAction)
Изменяет действие этого декодера для ошибок неотображаемых символов.
final String replacement()
Возвращает значение замены этого декодера.
final CharsetDecoder replaceWith(String newReplacement)
Изменяет значение замены этого декодера.
final CharsetDecoder reset()
Сбрасывает этот декодер, очищая внутреннее состояние.
CodingErrorAction unmappableCharacterAction()
Возвращает текущее действие этого декодера для ошибок неотображаемых символов.

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

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

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

CharsetDecoder

protected CharsetDecoder(Charset cs, float averageCharsPerByte, float maxCharsPerByte)
Инициализирует новый декодер. Новый декодер будет иметь заданные значения символов на байт, а его замена будет строкой "\uFFFD".
Параметры:
cs - Кодировка, которая создала этот декодер
averageCharsPerByte - Положительное значение с плавающей точкой, указывающее ожидаемое количество символов, которые будут произведены для каждого входного байта
maxCharsPerByte - Положительное значение с плавающей точкой, указывающее максимальное количество символов, которые будут произведены для каждого входного байта
Исключения:
IllegalArgumentException - Если условия на параметрах не выполняются

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

charset

public final Charset charset()
Возвращает кодировку, которая создала этот декодер.
Возвращает:
Кодировка данного декодера

replacement

public final String replacement()
Возвращает значение замены этого декодера.
Возвращает:
Текущее значение замены декодера, которое никогда не является null и никогда не пусто

replaceWith

public final CharsetDecoder replaceWith(String newReplacement)
Изменяет значение замены этого декодера.

Этот метод вызывает метод implReplaceWith, передавая новую замену после проверки того, что новая замена приемлема.

Параметры:
newReplacement - Новая замена; не должна быть null, должна иметь ненулевую длину и не должна быть длиннее значения, возвращаемого методом maxCharsPerByte
Возвращает:
Этот декодер
Исключения:
IllegalArgumentException - Если условия на параметре не выполняются

implReplaceWith

protected void implReplaceWith(String newReplacement)
Сообщает об изменении значения замены этого декодера.

По умолчанию этот метод ничего не делает. Этот метод должен быть переопределен декодерами, которым требуется уведомление об изменениях замены.

Параметры:
newReplacement - Значение замены

malformedInputAction

public CodingErrorAction malformedInputAction()
Возвращает текущее действие декодера для ошибок неправильного ввода.
Возвращает:
Текущее действие для ошибок неправильного ввода, которое никогда не равно null

onMalformedInput

public final CharsetDecoder onMalformedInput(CodingErrorAction newAction)
Изменяет действие этого декодера для ошибок неправильного ввода.

Этот метод вызывает метод implOnMalformedInput, передавая новое действие.

Параметры:
newAction - Новое действие; не должно быть null
Возвращает:
Этот декодер
Исключения:
IllegalArgumentException - Если условие на параметре не выполняется

implOnMalformedInput

protected void implOnMalformedInput(CodingErrorAction newAction)
Сообщает об изменении действия декодера для ошибок неправильного ввода.

По умолчанию этот метод ничего не делает. Этот метод должен быть переопределен декодерами, которым требуется уведомление об изменениях действия для ошибок неправильного ввода.

Параметры:
newAction - Новое действие

unmappableCharacterAction

public CodingErrorAction unmappableCharacterAction()
Возвращает текущее действие декодера для ошибок неотображаемых символов.
Возвращает:
Текущее действие для ошибок неотображаемых символов, которое никогда не равно null

onUnmappableCharacter

public final CharsetDecoder onUnmappableCharacter(CodingErrorAction newAction)
Изменяет действие этого декодера для ошибок неотображаемых символов.

Этот метод вызывает метод implOnUnmappableCharacter, передавая новое действие.

Параметры:
newAction - Новое действие; не должно быть null
Возвращает:
Этот декодер
Исключения:
IllegalArgumentException - Если условие на параметре не выполняется

implOnUnmappableCharacter

protected void implOnUnmappableCharacter(CodingErrorAction newAction)
Сообщает об изменении действия декодера для ошибок неотображаемых символов.

По умолчанию этот метод ничего не делает. Этот метод должен быть переопределен декодерами, которым требуется уведомление об изменениях действия для ошибок неотображаемых символов.

Параметры:
newAction - Новое действие

averageCharsPerByte

public final float averageCharsPerByte()
Возвращает среднее количество символов, которые будут произведены для каждого байта входных данных. Это эвристическое значение может быть использовано для оценки размера буфера вывода, необходимого для заданной последовательности входных данных.
Возвращает:
Среднее количество символов, производимых на байт входных данных

maxCharsPerByte

public final float maxCharsPerByte()
Возвращает максимальное количество символов, которые будут произведены для каждого байта входных данных. Это значение может быть использовано для вычисления наихудшего случая размера буфера вывода, необходимого для заданной последовательности входных данных. Это значение учитывает любые необходимые независимые от содержимого префиксные или суффиксные символы.
Возвращает:
Максимальное количество символов, производимых на байт входных данных

decode

public final CoderResult decode(ByteBuffer in, CharBuffer out, boolean endOfInput)
Декодирует как можно больше байтов из заданного входного буфера, записывая результаты в заданный выходной буфер.

Буферы читаются и записываются, начиная с их текущих позиций. Максимально in.remaining() байт будет считано и максимально out.remaining() символов будет записано. Позиции буферов будут сдвинуты, чтобы отразить прочитанные байты и записанные символы, но метки и пределы не будут изменены.

В дополнение к чтению байтов из входного буфера и записи символов в выходной буфер, этот метод возвращает объект CoderResult, чтобы описать причину завершения:

  • CoderResult.UNDERFLOW указывает, что как можно больше входного буфера было декодировано. Если больше нет входных данных, вызывающий метод может перейти к следующему шагу операции декодирования. В противном случае этот метод должен быть вызван снова с дополнительными входными данными.

  • CoderResult.OVERFLOW указывает, что в выходном буфере недостаточно места для декодирования дополнительных байтов. Этот метод должен быть вызван снова с выходным буфером, имеющим больше оставшихся символов. Обычно это делается путем сброса декодированных символов из выходного буфера.

  • Результат неправильного входного значения указывает, что была обнаружена ошибка неверного входного значения. Неправильные байты начинаются с позиции входного буфера (возможно, увеличенной); количество неправильных байтов можно определить, вызвав метод length объекта результата. Этот случай применяется только в том случае, если действие неправильного входного значения этого декодера равно CodingErrorAction.REPORT; в противном случае неправильный вход будет проигнорирован или заменен, как запрошено.

  • Результат непреобразуемого символа указывает, что была обнаружена ошибка непреобразуемого символа. Байты, декодирующие непреобразуемый символ, начинаются с позиции входного буфера (возможно, увеличенной); количество таких байтов можно определить, вызвав метод length объекта результата. Этот случай применяется только в том случае, если действие непреобразуемого символа этого декодера равно CodingErrorAction.REPORT; в противном случае непреобразуемый символ будет проигнорирован или заменен, как запрошено.

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

Параметр endOfInput сообщает этому методу, может ли вызывающий метод предоставить дополнительные входные данные, помимо содержащихся в заданном входном буфере. Если есть возможность предоставить дополнительные входные данные, вызывающий метод должен передать false для этого параметра; если нет возможности предоставить дополнительные входные данные, вызывающий метод должен передать true. Не является ошибкой, и на самом деле это довольно распространённо, передавать false в одном вызове, а затем обнаружить, что на самом деле дополнительные входные данные недоступны. Однако важно, чтобы окончательный вызов этого метода в последовательности вызовов всегда передавал true, чтобы все оставшиеся нераскодированные входные данные обрабатывались как неправильные.

Этот метод работает, вызывая метод decodeLoop, интерпретируя его результаты, обрабатывая ошибки и вызывая его повторно по необходимости.

Parameters:
in - Входной буфер байтов
out - Выходной буфер символов
endOfInput - true, только если вызывающий метод не может предоставить дополнительные входные байты, помимо содержащихся в заданном буфере
Returns:
Объект coder-result, описывающий причину завершения
Throws:
IllegalStateException - Если операция декодирования уже запущена, а предыдущий шаг не был вызовом метода reset, или этого метода со значением false для параметра endOfInput, или этого метода со значением true для параметра endOfInput, но возвращаемое значение указывает на незавершенную операцию декодирования
CoderMalfunctionError - Если вызов метода decodeLoop вызвал непредвиденную ошибку

flush

public final CoderResult flush(CharBuffer out)
Очищает этот декодер.

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

Любые дополнительные выходные данные записываются в выходной буфер, начиная с его текущей позиции. Максимально out.remaining() символов будет записано. Позиция буфера будет соответствующим образом сдвинута, но его метка и предел не будут изменены.

Если этот метод завершился успешно, то он возвращает CoderResult.UNDERFLOW. Если в выходном буфере недостаточно места, то он возвращает CoderResult.OVERFLOW. Если это произойдет, то этот метод должен быть вызван снова с выходным буфером, имеющим больше места, для завершения текущей операции декодирования.

Если этот декодер уже очищен, вызов этого метода не имеет эффекта.

Этот метод вызывает метод implFlush для выполнения фактической операции очистки.

Parameters:
out - Выходной буфер символов
Returns:
Объект coder-result, либо CoderResult.UNDERFLOW, либо CoderResult.OVERFLOW
Throws:
IllegalStateException - Если предыдущий шаг текущей операции декодирования был вызовом метода flush или трёх-аргументного метода decode со значением true для параметра endOfInput

implFlush

protected CoderResult implFlush(CharBuffer out)
Очищает этот декодер.

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

Parameters:
out - Выходной буфер символов
Returns:
Объект coder-result, либо CoderResult.UNDERFLOW, либо CoderResult.OVERFLOW

reset

public final CharsetDecoder reset()
Сбрасывает этот декодер, очищая любое внутреннее состояние.

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

Returns:
Этот декодер

implReset

protected void implReset()
Сбрасывает этот декодер, очищая любое внутреннее состояние, специфичное для кодировки.

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

decodeLoop

protected abstract CoderResult decodeLoop(ByteBuffer in, CharBuffer out)
Декодирует один или несколько байтов в один или несколько символов.

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

Буферы читаются и записываются, начиная с их текущих позиций. Максимально in.remaining() байт будет считано, и максимально out.remaining() символов будет записано. Позиции буферов будут сдвинуты, чтобы отразить прочитанные байты и записанные символы, но их метки и пределы не будут изменены.

Этот метод возвращает объект CoderResult, чтобы описать причину завершения, так же как метод decode. Большинство реализаций этого метода будут обрабатывать ошибки декодирования, возвращая соответствующий объект результата для интерпретации методом decode. Оптимизированная реализация вместо этого может проверить соответствующее действие по обработке ошибок и выполнить это действие сама.

Реализация этого метода может выполнять произвольный просмотр вперёд, возвращая CoderResult.UNDERFLOW до тех пор, пока не получит достаточных входных данных.

Parameters:
in - Входной буфер байтов
out - Выходной буфер символов
Returns:
Объект coder-result, описывающий причину завершения

decode

public final CharBuffer decode(ByteBuffer in) throws CharacterCodingException
Удобный метод, который декодирует оставшееся содержимое одного входного буфера байтов в новый, выделенный буфер символов.

Этот метод реализует всю операцию декодирования; то есть, он сбрасывает этот декодер, затем декодирует байты в данном буфере байтов и, наконец, сбрасывает этот декодер. Поэтому этот метод не следует вызывать, если операция декодирования уже выполняется.

Parameters:
in - Входной буфер байтов
Returns:
Новый, выделенный буфер символов, содержащий результат операции декодирования. Позиция буфера будет равна нулю, а его предел будет следовать за последним записанным символом.
Throws:
IllegalStateException - Если операция декодирования уже выполняется
MalformedInputException - Если последовательность байтов, начиная с текущей позиции входного буфера, не является допустимой для этого набора символов, и текущее действие некорректного ввода равно CodingErrorAction.REPORT
UnmappableCharacterException - Если последовательность байтов, начинающаяся с текущей позиции входного буфера, не может быть отображена в эквивалентную последовательность символов, и текущее действие неопределяемого символа равно CodingErrorAction.REPORT
CharacterCodingException - MalformedInputException если последовательность байтов, начинающаяся с текущей позиции входного буфера, не является допустимой для этого набора символов, и текущее действие некорректного ввода равно CodingErrorAction.REPORT; UnmappableCharacterException если последовательность байтов, начинающаяся с текущей позиции входного буфера, не может быть отображена в эквивалентную последовательность символов, и текущее действие неопределяемого символа равно CodingErrorAction.REPORT
OutOfMemoryError - Если буфер выходных символов для запрошенного размера входного буфера байтов не может быть выделен

isAutoDetecting

public boolean isAutoDetecting()
Указывает, реализует ли этот декодер набор символов с автоматическим определением.

Базовая реализация этого метода всегда возвращает false; она должна быть переопределена декодерами с автоматическим определением, чтобы вернуть true.

Returns:
true, если и только если этот декодер реализует набор символов с автоматическим определением

isCharsetDetected

public boolean isCharsetDetected()
Указывает, определил ли этот декодер набор символов (необязательная операция).

Если этот декодер реализует набор символов с автоматическим определением, то в какой-то момент во время операции декодирования этот метод может начать возвращать true, чтобы указать, что в последовательности байтов ввода был определен конкретный набор символов. После этого можно вызвать метод detectedCharset для извлечения определенного набора символов.

То, что этот метод возвращает false, не подразумевает, что пока не было декодировано ни одного байта. Некоторые декодеры с автоматическим определением способны декодировать часть или даже всю последовательность входных байтов без фиксации на конкретном наборе символов.

Базовая реализация этого метода всегда выбрасывает UnsupportedOperationException; она должна быть переопределена декодерами с автоматическим определением, чтобы возвращать true после определения набора символов ввода.

Returns:
true, если и только если этот декодер определил конкретный набор символов
Throws:
UnsupportedOperationException - Если этот декодер не реализует набор символов с автоматическим определением

detectedCharset

public Charset detectedCharset()
Возвращает набор символов, который был определен этим декодером (необязательная операция).

Если этот декодер реализует набор символов с автоматическим определением, то этот метод возвращает фактический набор символов после его определения. После этого момента этот метод возвращает то же значение в течение текущей операции декодирования. Если для определения фактического набора символов еще не было прочитано достаточно байтов, то этот метод выбрасывает IllegalStateException.

Базовая реализация этого метода всегда выбрасывает UnsupportedOperationException; она должна быть переопределена декодерами с автоматическим определением, чтобы вернуть соответствующее значение.

Returns:
Набор символов, определенный этим декодером с автоматическим определением, или null, если набор символов еще не определен
Throws:
IllegalStateException - Если для определения набора символов не было прочитано достаточного количества байтов
UnsupportedOperationException - Если этот декодер не реализует набор символов с автоматическим определением

© 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/nio/charset/CharsetDecoder.html

Spec-Zone.ru

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