Класс CharsetDecoder
public abstract class CharsetDecoder extends Object
Входная последовательность байтов передается в буфере байтов или серии таких буферов. Выходная последовательность символов записывается в буфер символов или серию таких буферов. Декодер всегда следует использовать, выполняя следующую последовательность вызовов методов, далее именуемую операцией декодирования:
Сбросить декодер с помощью метода
reset, если он еще не использовался;Вызывать метод
decodeноль или более раз, пока могут быть доступны дополнительные входные данные, передаваяfalseв качестве аргументаendOfInputи заполняя входной буфер и освобождая выходной буфер между вызовами;Вызвать метод
decodeв последний раз, передавtrueв качестве аргументаendOfInput; затемВызвать метод
flush, чтобы декодер мог сбросить любое внутреннее состояние в выходной буфер.
decode из входного буфера декодируется максимально возможное количество байтов, а полученные символы записываются в выходной буфер. Метод decode возвращает управление, когда требуется больше входных данных, когда в выходном буфере недостаточно места или когда произошла ошибка декодирования. В каждом случае возвращается объект CoderResult, описывающий причину завершения. Вызывающий код может проверить этот объект, заполнить входной буфер, освободить выходной буфер или попытаться восстановиться после ошибки декодирования, в зависимости от ситуации, и повторить попытку. Существует два основных типа ошибок декодирования. Если входная последовательность байтов недопустима для данной кодировки, входные данные считаются неправильно сформированными. Если входная последовательность байтов допустима, но не может быть сопоставлена допустимому символу Unicode, обнаруживается несопоставимый символ.
Обработка ошибки декодирования зависит от действия, запрошенного для этого типа ошибки и описанного экземпляром класса CodingErrorAction. Возможные действия при ошибке: игнорировать ошибочные входные данные, сообщить о них вызывающему коду через возвращенный объект CoderResult или заменить ошибочные входные данные текущим значением строки замены. Начальное значение замены — "\uFFFD"; его можно изменить с помощью метода replaceWith.
По умолчанию при ошибках неправильно сформированных входных данных и несопоставимых символов используется действие сообщить. Действие при ошибке неправильно сформированных входных данных можно изменить с помощью метода onMalformedInput; действие при несопоставимых символах можно изменить с помощью метода onUnmappableCharacter.
Этот класс предназначен для обработки многих деталей процесса декодирования, включая реализацию действий при ошибках. Декодеру для конкретной кодировки, являющемуся конкретным подклассом этого класса, достаточно реализовать абстрактный метод decodeLoop, в котором заключен основной цикл декодирования. Подкласс, поддерживающий внутреннее состояние, должен также переопределить методы implFlush и implReset.
Экземпляры этого класса небезопасно использовать одновременно из нескольких потоков.
- С версии:
- 1.4
- См. также:
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Инициализирует новый декодер. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
final float |
averageCharsPerByte() |
Возвращает среднее количество символов, которое будет получено для каждого входного байта. |
final Charset |
charset() |
Возвращает кодировку, создавшую этот декодер. |
final CharBuffer |
decode |
Вспомогательный метод, декодирующий оставшееся содержимое одного входного буфера байтов в новый буфер символов. |
final CoderResult |
decode |
Декодирует максимально возможное количество байтов из указанного входного буфера, записывая результаты в указанный выходной буфер. |
protected abstract CoderResult |
decodeLoop |
Декодирует один или несколько байтов в один или несколько символов. |
Charset |
detectedCharset() |
Получает кодировку, обнаруженную этим декодером (необязательная операция). |
final CoderResult |
flush |
Сбрасывает буфер этого декодера. |
protected CoderResult |
implFlush |
Сбрасывает этот декодер. |
protected void |
implOnMalformedInput |
Сообщает об изменении действия этого декодера при неправильно сформированных входных данных. |
protected void |
implOnUnmappableCharacter |
Сообщает об изменении действия этого декодера при несопоставимых символах. |
protected void |
implReplaceWith |
Сообщает об изменении значения замены этого декодера. |
protected void |
implReset() |
Сбрасывает этот декодер, очищая любое внутреннее состояние, зависящее от кодировки. |
boolean |
isAutoDetecting() |
Определяет, реализует ли этот декодер автоматически определяемую кодировку. |
boolean |
isCharsetDetected() |
Определяет, обнаружил ли этот декодер кодировку (необязательная операция). |
CodingErrorAction |
malformedInputAction() |
Возвращает текущее действие этого декодера при ошибках неправильно сформированных входных данных. |
final float |
maxCharsPerByte() |
Возвращает максимальное количество символов, которое будет получено для каждого входного байта. |
final CharsetDecoder |
onMalformedInput |
Изменяет действие этого декодера при ошибках неправильно сформированных входных данных. |
final CharsetDecoder |
onUnmappableCharacter |
Изменяет действие этого декодера при ошибках, связанных с несопоставимыми символами. |
final String |
replacement() |
Возвращает значение замены этого декодера. |
final CharsetDecoder |
replaceWith |
Изменяет значение замены этого декодера. |
final CharsetDecoder |
reset() |
Сбрасывает этот декодер, очищая любое внутреннее состояние. |
CodingErrorAction |
unmappableCharacterAction() |
Возвращает текущее действие этого декодера при ошибках, связанных с несопоставимыми символами. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создает и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли этот объект какому-либо другому объекту. |
protected void |
finalize() |
Устарело, будет удалено: этот элемент API может быть удален в будущей версии. Финализация объявлена устаревшей и подлежит удалению в одном из следующих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает хеш-код этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо истечения определенного периода реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо истечения определенного периода реального времени. |
Подробное описание конструкторов
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— Если этот декодер не реализует автоматическое определение набора символов
© 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.