Класс CharsetDecoder
public abstract class CharsetDecoder extends Object
Последовательность входных байтов предоставляется в буфере байтов или в серии таких буферов. Последовательность выходных символов записывается в буфер символов или в серии таких буферов. Декодер всегда должен использоваться, выполняя следующую последовательность вызовов методов, далее называемую *операцией декодирования*:
Сбросить декодер с помощью метода
reset, если он не использовался ранее;Вызвать метод
decodeноль или более раз, пока доступны дополнительные входные данные, передаваяfalseв качестве аргументаendOfInputи заполняя буфер ввода и очищая буфер вывода между вызовами;Вызвать метод
decodeодин раз в заключение, передаваяtrueв качестве аргументаendOfInput; и затемВызвать метод
flush, чтобы декодер мог очистить любое внутреннее состояние в буфер вывода.
decode будет декодировать как можно больше байтов из входного буфера, записывая полученные символы в буфер вывода. Метод decode возвращает, когда требуется больше входных данных, когда в буфере вывода нет места или произошла ошибка декодирования. В каждом случае возвращается объект CoderResult, который описывает причину завершения. Вызывающий код может проверить этот объект, заполнить буфер ввода, очистить буфер вывода или попытаться восстановиться от ошибки декодирования, в зависимости от ситуации, и повторить попытку. Существуют два основных типа ошибок декодирования. Если последовательность входных байтов не является допустимой для данной кодировки, то вход считается *неправильным*. Если последовательность входных байтов допустима, но не может быть отображена в допустимый символ Юникода, то встречен *неотображаемый символ*.
Обработка ошибки декодирования зависит от заданного действия для данного типа ошибки, которое описывается экземпляром класса 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() |
Возвращает текущее действие этого декодера для ошибок неотображаемых символов. |
Подробное описание конструкторов
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