Spec-Zone.ru › OpenJDK 17

Класс CharsetDecoder

java.lang.Object
java.nio.charset.CharsetDecoder
public abstract class CharsetDecoder extends Object
Движок, способный преобразовывать последовательность байтов в определённой кодировке в последовательность символов Юникода в формате 16 бит.

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

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

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

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

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

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

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

Способ обработки ошибки декодирования зависит от запрошенного действия для этого типа ошибки, которое описывается экземпляром класса CodingErrorAction. Возможные действия по обработке ошибок: пропустить ошибочный ввод, сообщить об ошибке вызывающему методу через возвращаемый объект CoderResult или заменить ошибочный ввод текущим значением строки замены. Значение замены имеет начальное значение "\uFFFD"; его значение может быть изменено с помощью метода replaceWith.

По умолчанию действия для ошибок неправильного ввода и неотображаемого символа - сообщить об них. Действие для ошибки неправильного ввода может быть изменено с помощью метода onMalformedInput; действие для ошибки неотображаемого символа может быть изменено с помощью метода onUnmappableCharacter.

Этот класс разработан для обработки многих деталей процесса декодирования, включая реализацию действий по обработке ошибок. Декодер для конкретной кодировки, являющийся конкретным подклассом этого класса, должен только реализовать абстрактный метод decodeLoop, который обобщает основной цикл декодирования. Подкласс, сохраняющий внутреннее состояние, должен также переопределить методы implFlush и implReset.

Экземпляры этого класса не являются потокобезопасными.

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

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

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

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

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

Spec-Zone.ru

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