Spec-Zone.ru › OpenJDK 21

Класс CharsetDecoder

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

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

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

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

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

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

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

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

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

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

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

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

Since:
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, интерпретируя его результаты, обрабатывая условия ошибок и вызывая его снова по мере необходимости.

Параметры:
in - Буфер байтов ввода
out - Буфер символов вывода
endOfInput - true если и только если вызывающий не может предоставить дополнительных байтов ввода за пределами данного буфера
Возвращает:
Объект coder-result, описывающий причину завершения
Исключения:
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:
Объект результата кодировщика, либо CoderResult.UNDERFLOW, либо CoderResult.OVERFLOW
Throws:
IllegalStateException - Если предыдущий шаг текущей операции декодирования был вызовом ни метода flush, ни метода с тремя аргументами decode со значением true для параметра endOfInput

implFlush

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

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

Parameters:
out - Буфер вывода символов
Returns:
Объект результата кодировщика, либо CoderResult.UNDERFLOW, либо CoderResult.OVERFLOW

reset

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

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

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

implReset

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

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

decodeLoop

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

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

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

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

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

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

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, 2023, 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/21/docs/api/java.base/java/nio/charset/CharsetDecoder.html

Spec-Zone.ru

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