Spec-Zone.ru › OpenJDK 27

Класс CharsetDecoder

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

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

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

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

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

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

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

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

Обработка ошибки декодирования зависит от действия, запрошенного для этого типа ошибки и описанного экземпляром класса 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()
Возвращает текущее действие этого декодера при ошибках, связанных с несопоставимыми символами.

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

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Модификатор и тип Метод Описание
protected Object clone()
Создает и возвращает копию этого объекта.
boolean equals(Object obj)
Указывает, равен ли этот объект какому-либо другому объекту.
protected void finalize()
Устарело, будет удалено: этот элемент API может быть удален в будущей версии.
Финализация объявлена устаревшей и подлежит удалению в одном из следующих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения этого Object.
int hashCode()
Возвращает хеш-код этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
String toString()
Возвращает строковое представление объекта.
final void wait()
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания.
final void wait(long timeoutMillis)
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо истечения определенного периода реального времени.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо истечения определенного периода реального времени.

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

CharsetDecoder

protected CharsetDecoder(Charset cs, float averageCharsPerByte, float maxCharsPerByte)
Инициализирует новый декодер. Новый декодер будет иметь заданные значения количества символов на байт, а его строкой замены будет "\uFFFD".
Параметры:
cs — Набор символов, создавший этот декодер
averageCharsPerByte — Положительное значение типа float, указывающее ожидаемое количество символов, которое будет создано для каждого входного байта
maxCharsPerByte — Положительное значение типа float, указывающее максимальное количество символов, которое будет создано для каждого входного байта
Исключения:
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 тогда и только тогда, когда вызывающий код не может предоставить дополнительные входные байты помимо содержащихся в заданном буфере
Возвращает:
Объект результата кодирования, описывающий причину завершения
Исключения:
IllegalStateException — Если операция декодирования уже выполняется, а предыдущим шагом был вызов не метода reset, не этого метода со значением false для параметра endOfInput и не этого метода со значением true для параметра endOfInput, вернувший значение, указывающее на незавершённую операцию декодирования
CoderMalfunctionError — Если вызов метода decodeLoop привёл к неожиданному исключению

flush

public final CoderResult flush(CharBuffer out)
Сбрасывает буфер этого декодера.

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

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

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

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

Для выполнения операции сброса этот метод вызывает метод implFlush.

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

implFlush

protected CoderResult implFlush(CharBuffer out)
Сбрасывает буфер этого декодера.

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

Параметры:
out — Выходной символьный буфер
Возвращает:
Объект результата кодирования: либо CoderResult.UNDERFLOW, либо CoderResult.OVERFLOW

reset

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

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

Возвращает:
Этот декодер

implReset

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

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

decodeLoop

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

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

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

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

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

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

decode

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

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

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

isAutoDetecting

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

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

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

isCharsetDetected

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

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

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

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

Возвращает:
true тогда и только тогда, когда этот декодер обнаружил конкретный набор символов
Исключения:
UnsupportedOperationException — Если этот декодер не реализует автоматическое определение набора символов

detectedCharset

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

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

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

Возвращает:
Набор символов, обнаруженный этим декодером с автоматическим определением, или null, если набор символов ещё не определён
Исключения:
IllegalStateException — Если прочитано недостаточно байтов для определения набора символов
UnsupportedOperationException — Если этот декодер не реализует автоматическое определение набора символов

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её дочерних компаний в США и других странах.
Авторские права © 1993, 2026, Oracle и/или её дочерние компании, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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.

Spec-Zone.ru

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