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