Класс 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, интерпретируя его результаты, обрабатывая условия ошибок и вызывая его повторно при необходимости.
- 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
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, 2021, 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/17/docs/api/java.base/java/nio/charset/CharsetDecoder.html