Класс CharsetEncoder

public abstract class CharsetEncoder
extends Object

Двигатель, который может преобразовывать последовательность символов Юникода в последовательность байтов в определённом наборе символов.

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

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

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

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

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

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

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

Обработка ошибки кодирования зависит от действия, запрошенного для этого типа ошибки, которое описывается экземпляром класса CodingErrorAction. Возможные действия по обработке ошибок: пропустить ошибочный ввод, сообщить об ошибке вызывающему коду через возвращаемый объект CoderResult или заменить ошибочный ввод текущим значением массива байтов замены. Замена по умолчанию устанавливается для кодировщика, что часто (но не всегда) имеет начальное значение { }; её значение может быть изменено с помощью метода replaceWith.

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

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

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

Since:
1.4
См. также:
ByteBuffer, CharBuffer, Charset, CharsetDecoder

Конструкторы

Модификатор Конструктор Описание
protected CharsetEncoder​(Charset cs, float averageBytesPerChar, float maxBytesPerChar)

Инициализирует новый кодировщик.

protected CharsetEncoder​(Charset cs, float averageBytesPerChar, float maxBytesPerChar, byte[] replacement)

Инициализирует новый кодировщик.

Методы

Модификатор и тип Метод Описание
float averageBytesPerChar()

Возвращает среднее количество байтов, которое будет произведено для каждого символа входных данных.

boolean canEncode​(char c)

Указывает, может ли этот кодировщик закодировать данный символ.

boolean canEncode​(CharSequence cs)

Указывает, может ли этот кодировщик закодировать данную последовательность символов.

Charset charset()

Возвращает набор символов, который создал этот кодировщик.

ByteBuffer encode​(CharBuffer in)

Удобный метод, который кодирует оставшееся содержимое одного входного буфера символов в новый буфер байтов.

CoderResult encode​(CharBuffer in, ByteBuffer out, boolean endOfInput)

Кодирует как можно больше символов из данного входного буфера, записывая результаты в данный выходной буфер.

protected abstract CoderResult encodeLoop​(CharBuffer in, ByteBuffer out)

Кодирует один или несколько символов в один или несколько байтов.

CoderResult flush​(ByteBuffer out)

Очищает этот кодировщик.

protected CoderResult implFlush​(ByteBuffer out)

Очищает этот кодировщик.

protected void implOnMalformedInput​(CodingErrorAction newAction)

Сообщает о изменении действия некорректного ввода этого кодировщика.

protected void implOnUnmappableCharacter​(CodingErrorAction newAction)

Сообщает о изменении действия необозначенного символа этого кодировщика.

protected void implReplaceWith​(byte[] newReplacement)

Сообщает о изменении значения замены этого кодировщика.

protected void implReset()

Сбрасывает этот кодировщик, очищая любое состояние, специфичное для набора символов.

boolean isLegalReplacement​(byte[] repl)

Указывает, является ли данный массив байтов допустимым значением замены для этого кодировщика.

CodingErrorAction malformedInputAction()

Возвращает текущее действие этого кодировщика для ошибок некорректного ввода.

float maxBytesPerChar()

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

CharsetEncoder onMalformedInput​(CodingErrorAction newAction)

Изменяет действие этого кодировщика для ошибок некорректного ввода.

CharsetEncoder onUnmappableCharacter​(CodingErrorAction newAction)

Изменяет действие этого кодировщика для ошибок необозначенного символа.

byte[] replacement()

Возвращает значение замены этого кодировщика.

CharsetEncoder replaceWith​(byte[] newReplacement)

Изменяет значение замены этого кодировщика.

CharsetEncoder reset()

Сбрасывает этот кодировщик, очищая внутреннее состояние.

CodingErrorAction unmappableCharacterAction()

Возвращает текущее действие этого кодировщика для ошибок необозначенного символа.

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

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

Конструкторы

CharsetEncoder

protected CharsetEncoder(Charset cs,
                         float averageBytesPerChar,
                         float maxBytesPerChar,
                         byte[] replacement)

Инициализирует новый кодировщик. Новый кодировщик будет иметь заданные значения байтов на символ и замены.

Параметры:
cs - Набор символов, создавший этот кодировщик
averageBytesPerChar - Положительное значение с плавающей точкой, указывающее ожидаемое количество байтов, которое будет произведено для каждого символа ввода
maxBytesPerChar - Положительное значение с плавающей точкой, указывающее максимальное количество байтов, которое будет произведено для каждого символа ввода
replacement - Исходная замена; не должна быть null, должна иметь ненулевую длину, не должна быть длиннее maxBytesPerChar и должна быть допустимой
Исключения:
IllegalArgumentException - Если предварительные условия для параметров не выполнены

CharsetEncoder

protected CharsetEncoder(Charset cs,
                         float averageBytesPerChar,
                         float maxBytesPerChar)

Инициализирует новый кодировщик. Новый кодировщик будет иметь заданные значения байтов на символ, а его замена будет массивом байтов { (byte)'?' }.

Параметры:
cs - Набор символов, создавший этот кодировщик
averageBytesPerChar - Положительное значение с плавающей точкой, указывающее ожидаемое количество байтов, которое будет произведено для каждого символа ввода
maxBytesPerChar - Положительное значение с плавающей точкой, указывающее максимальное количество байтов, которое будет произведено для каждого символа ввода
Исключения:
IllegalArgumentException - Если предварительные условия для параметров не выполнены

Методы

charset

public final Charset charset()

Возвращает кодировку, которая создала этот кодировщик.

Возвращает:
Кодировка этого кодировщика

replacement

public final byte[] replacement()

Возвращает значение замены этого кодировщика.

Возвращает:
Текущее значение замены кодировщика, которое никогда не null и никогда не пусто

replaceWith

public final CharsetEncoder replaceWith(byte[] newReplacement)

Изменяет значение замены этого кодировщика.

Этот метод вызывает метод implReplaceWith, передавая новое значение замены после проверки того, что новая замена приемлема.

Параметры:
newReplacement - Новое значение замены; не должно быть null, длина должна быть ненулевой, длина не должна превышать значения, возвращаемого методом maxBytesPerChar, и должно быть legal
Возвращает:
Этот кодировщик
Исключения:
IllegalArgumentException - Если предварительные условия для параметра не выполняются

implReplaceWith

protected void implReplaceWith(byte[] newReplacement)

Сообщает об изменении значения замены этого кодировщика.

Реализация по умолчанию этого метода ничего не делает. Этот метод должен быть переопределен кодировщиками, которые требуют уведомления об изменениях в значении замены.

Параметры:
newReplacement - Значение замены

isLegalReplacement

public boolean isLegalReplacement(byte[] repl)

Определяет, является ли заданный массив байтов допустимым значением замены для этого кодировщика.

Значение замены является допустимым только в том случае, если это допустимая последовательность байтов в кодировке этого кодировщика; то есть, его можно декодировать в один или несколько шестнадцатибитных символов Юникода.

Реализация по умолчанию этого метода не очень эффективна; обычно ее следует переопределять для повышения производительности.

Параметры:
repl - Массив байтов для проверки
Возвращает:
true тогда и только тогда, когда заданный массив байтов является допустимым значением замены для этого кодировщика

malformedInputAction

public CodingErrorAction malformedInputAction()

Возвращает текущее действие кодировщика для ошибок неверного входного данных.

Возвращает:
Текущее действие для ошибок неверного входного данных, которое никогда не null

onMalformedInput

public final CharsetEncoder onMalformedInput(CodingErrorAction newAction)

Изменяет действие этого кодировщика для ошибок неверного входного данных.

Этот метод вызывает метод implOnMalformedInput, передавая новое действие.

Параметры:
newAction - Новое действие; не должно быть null
Возвращает:
Этот кодировщик
Исключения:
IllegalArgumentException - Если условие предопределения для параметра не выполняется

implOnMalformedInput

protected void implOnMalformedInput(CodingErrorAction newAction)

Сообщает об изменении действия кодировщика для ошибок неверного входного данных.

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

Параметры:
newAction - Новое действие

unmappableCharacterAction

public CodingErrorAction unmappableCharacterAction()

Возвращает текущее действие кодировщика для ошибок неотображаемых символов.

Возвращает:
Текущее действие для ошибок неотображаемых символов, которое никогда не null

onUnmappableCharacter

public final CharsetEncoder onUnmappableCharacter(CodingErrorAction newAction)

Изменяет действие этого кодировщика для ошибок неотображаемых символов.

Этот метод вызывает метод implOnUnmappableCharacter, передавая новое действие.

Параметры:
newAction - Новое действие; не должно быть null
Возвращает:
Этот кодировщик
Исключения:
IllegalArgumentException - Если условие предопределения для параметра не выполняется

implOnUnmappableCharacter

protected void implOnUnmappableCharacter(CodingErrorAction newAction)

Сообщает об изменении действия кодировщика для ошибок неотображаемых символов.

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

Параметры:
newAction - Новое действие

averageBytesPerChar

public final float averageBytesPerChar()

Возвращает среднее количество байтов, которое будет произведено для каждого символа ввода. Это эвристическое значение может использоваться для оценки размера буфера вывода, необходимого для заданной последовательности ввода.

Возвращает:
Среднее количество байтов, производимых на символ входных данных

maxBytesPerChar

public final float maxBytesPerChar()

Возвращает максимальное количество байтов, которое будет произведено для каждого символа ввода. Это значение может использоваться для вычисления наихудшего случая размера буфера вывода, необходимого для заданной последовательности ввода.

Возвращает:
Максимальное количество байтов, производимых на символ входных данных

encode

public final CoderResult encode(CharBuffer in,
                                ByteBuffer out,
                                boolean endOfInput)

Кодирует как можно больше символов из заданного буфера ввода, записывая результаты в заданный буфер вывода.

Буферы считываются и записываются, начиная с их текущих позиций. Максимальное количество in.remaining() символов будет считано, и максимальное количество out.remaining() байтов будет записано. Позиции буферов будут продвинуты для отражения считанных символов и записанных байтов, но их метки и границы не будут изменены.

В дополнение к чтению символов из буфера ввода и записи байтов в буфер вывода, этот метод возвращает объект CoderResult для описания причины завершения:

  • CoderResult.UNDERFLOW указывает, что как можно больше буфера ввода было закодировано. Если дальнейшего ввода нет, вызывающая сторона может перейти к следующему шагу операции кодирования. В противном случае этот метод следует вызвать снова с дополнительным вводом.

  • CoderResult.OVERFLOW указывает, что в буфере вывода недостаточно места для кодирования дополнительных символов. Этот метод следует вызвать снова с буфером вывода, у которого больше оставшихся байтов. Обычно это делается путем сброса закодированных байтов из буфера вывода.

  • Результат ошибки неверного ввода указывает, что была обнаружена ошибка неверного ввода. Неверные символы начинаются с позиции буфера ввода (возможно, увеличенной); количество неверных символов можно определить, вызвав метод length объекта результата. Этот случай применим только в том случае, если действие ошибки неверного ввода этого кодировщика равно CodingErrorAction.REPORT; в противном случае неверный ввод будет пропущен или заменен в соответствии с запросом.

  • Результат ошибки неотображаемого символа указывает, что была обнаружена ошибка неотображаемого символа. Символы, которые кодируют неотображаемый символ, начинаются с позиции буфера ввода (возможно, увеличенной); количество таких символов можно определить, вызвав метод length объекта результата. Этот случай применим только в том случае, если действие ошибки неотображаемого символа этого кодировщика равно CodingErrorAction.REPORT; в противном случае неотображаемый символ будет пропущен или заменен в соответствии с запросом.

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

Параметр endOfInput сообщает этому методу, может ли вызывающая сторона предоставить дополнительный ввод, выходящий за рамки содержащегося в заданном буфере ввода. Если есть возможность предоставить дополнительный ввод, вызывающая сторона должна передать false для этого параметра; если нет возможности предоставить дополнительный ввод, вызывающая сторона должна передать true. Не является ошибкой, и, на самом деле, это довольно обычная ситуация, передать false в одном вызове и позже обнаружить, что на самом деле дополнительный ввод недоступен. Однако важно, чтобы в последнем вызове этого метода в последовательности вызовов всегда передавалось true , чтобы любой оставшийся нескодированный ввод обрабатывался как неверный.

Этот метод работает, вызывая метод encodeLoop, интерпретируя его результаты, обрабатывая ошибки и вызывая его повторно по необходимости.

Параметры:
in - Буфер символов ввода
out - Буфер байтов вывода
endOfInput - true если, и только если, вызывающая сторона не может предоставить дополнительных символов ввода, помимо тех, что находятся в заданном буфере
Возвращает:
Объект результата кодирования, описывающий причину завершения
Исключения:
IllegalStateException - Если уже идет операция кодирования, и предыдущий шаг был вызовом ни метода reset, ни этого метода со значением false для параметра endOfInput, ни этого метода со значением true для параметра endOfInput, но возвращаемое значение указывает на незавершенную операцию кодирования
CoderMalfunctionError - Если вызов метода encodeLoop вызвал непредвиденное исключение

flush

public final CoderResult flush(ByteBuffer out)

Очищает этот кодер.

Некоторые кодеры сохраняют внутреннее состояние и могут потребовать записи некоторых конечных байтов в буфер вывода после того, как вся входная последовательность была прочитана.

Любой дополнительный вывод записывается в буфер вывода начиная с его текущей позиции. Максимально out.remaining() байтов будет записано. Позиция буфера будет соответствующим образом продвинута, но метка и предел не будут изменены.

Если этот метод завершается успешно, то возвращает CoderResult.UNDERFLOW. Если в буфере вывода недостаточно места, то возвращает CoderResult.OVERFLOW. Если это произойдёт, то этот метод необходимо вызвать снова, с буфером вывода, у которого больше места, для завершения текущей операции кодирования.

Если этот кодер уже был очищен, то вызов этого метода не имеет эффекта.

Этот метод вызывает метод implFlush для выполнения фактической операции очистки.

Параметры:
out - Буфер байтов вывода
Возвращает:
Объект результата кодирования, либо CoderResult.UNDERFLOW, либо CoderResult.OVERFLOW
Вызывает исключение:
IllegalStateException - Если предыдущий шаг текущей операции кодирования был вызовом ни метода flush, ни трёхаргументного метода encode со значением true для параметра endOfInput

implFlush

protected CoderResult implFlush(ByteBuffer out)

Очищает этот кодер.

Стандартная реализация этого метода ничего не делает и всегда возвращает CoderResult.UNDERFLOW. Этот метод должен быть переопределен кодерами, которые могут потребовать записи конечных байтов в буфер вывода после того, как вся входная последовательность была прочитана.

Параметры:
out - Буфер байтов вывода
Возвращает:
Объект результата кодирования, либо CoderResult.UNDERFLOW, либо CoderResult.OVERFLOW

reset

public final CharsetEncoder reset()

Сбрасывает этот кодер, очищая любое внутреннее состояние.

Этот метод сбрасывает состояние, не зависящее от кодировки, а также вызывает метод implReset для выполнения любых действий по сбросу, зависящих от кодировки.

Возвращает:
Этот кодер

implReset

protected void implReset()

Сбрасывает этот кодер, очищая любое внутреннее состояние, зависящее от кодировки.

Стандартная реализация этого метода ничего не делает. Этот метод должен быть переопределен кодерами, которые сохраняют внутреннее состояние.

encodeLoop

protected abstract CoderResult encodeLoop(CharBuffer in,
                                          ByteBuffer out)

Кодирует один или несколько символов в один или несколько байтов.

Этот метод обобщает основной цикл кодирования, кодируя как можно больше символов, пока не исчерпаются входные данные, не закончится место в буфере вывода или не произойдёт ошибка кодирования. Этот метод вызывается методом encode, который обрабатывает интерпретацию результатов и восстановление от ошибок.

Буферы считываются и записываются, начиная с текущих позиций. Максимально in.remaining() символов будет прочитано и максимально out.remaining() байтов будет записано. Позиции буферов будут продвинуты для отражения прочитанных символов и записанных байтов, но их метки и пределы не будут изменены.

Этот метод возвращает объект CoderResult, чтобы описать причину завершения, аналогично методу encode. Большинство реализаций этого метода будут обрабатывать ошибки кодирования, возвращая соответствующий объект результата для интерпретации методом encode. Оптимизированная реализация может вместо этого проверить соответствующее действие с ошибкой и реализовать это действие сама.

Реализация этого метода может выполнять произвольный просмотр вперёд, возвращая CoderResult.UNDERFLOW, пока не получит достаточные входные данные.

Параметры:
in - Буфер входных символов
out - Буфер выходных байтов
Возвращает:
Объект результата кодирования, описывающий причину завершения

encode

public final ByteBuffer encode(CharBuffer in)
                        throws CharacterCodingException

Метод-удобство, который кодирует оставшееся содержимое одного буфера входных символов в новый выделенный буфер байтов.

Этот метод реализует всю операцию кодирования; то есть, он сбрасывает этот кодер, затем кодирует символы в заданном буфере символов и, наконец, очищает этот кодер. Поэтому этот метод не следует вызывать, если операция кодирования уже в процессе.

Параметры:
in - Буфер входных символов
Возвращает:
Новый выделенный буфер байтов, содержащий результат операции кодирования. Позиция буфера будет равна нулю, а его предел будет следовать за последним записанным байтом.
Вызывает исключение:
IllegalStateException - Если операция кодирования уже в процессе
MalformedInputException - Если последовательность символов, начинающаяся с текущей позиции входного буфера, не является законной последовательностью символов Юникода в 16-битном формате, и текущее действие при некорректном вводе - CodingErrorAction.REPORT
UnmappableCharacterException - Если последовательность символов, начинающаяся с текущей позиции входного буфера, не может быть отображена в эквивалентную последовательность байтов, и текущее действие при отображении недопустимого символа - CodingErrorAction.REPORT
CharacterCodingException

canEncode

public boolean canEncode(char c)

Указывает, может ли этот кодер закодировать данный символ.

Этот метод возвращает false если данный символ является замещающим символом; такие символы могут быть интерпретированы только тогда, когда они являются членами пары, состоящей из старшего замещающего символа, за которым следует младший замещающий символ. Метод canEncode(CharSequence) может использоваться для проверки возможности кодирования последовательности символов.

Этот метод может изменять состояние этого кодера; поэтому его не следует вызывать, если операция кодирования уже в процессе.

Стандартная реализация этого метода не очень эффективна; её обычно следует переопределить для повышения производительности.

Параметры:
c - Данный символ
Возвращает:
true если и только если этот кодер может закодировать данный символ
Вызывает исключение:
IllegalStateException - Если операция кодирования уже в процессе

canEncode

public boolean canEncode(CharSequence cs)

Указывает, может ли этот кодер закодировать данную последовательность символов.

Если этот метод возвращает false для определенной последовательности символов, то более подробную информацию о том, почему последовательность не может быть закодирована, можно получить, выполнив полную операцию кодирования.

Этот метод может изменять состояние этого кодера; поэтому его не следует вызывать, если операция кодирования уже в процессе.

Стандартная реализация этого метода не очень эффективна; её обычно следует переопределить для повышения производительности.

Параметры:
cs - Данная последовательность символов
Возвращает:
true если и только если этот кодер может закодировать данные символы без выброса исключений и без выполнения каких-либо замен
Вызывает исключение:
IllegalStateException - Если операция кодирования уже в процессе

© 1993, 2020, 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/11/docs/api/java.base/java/nio/charset/CharsetEncoder.html

Spec-Zone .ru
спецификации, руководства, описания, API