Класс CharsetEncoder
- java.lang.Object
-
- java.nio.charset.CharsetEncoder
public abstract class CharsetEncoder extends Object
Двигатель, который может преобразовывать последовательность символов Юникода в последовательность байтов в определённом наборе символов.
Последовательность входных символов предоставляется в буфере символов или в серии таких буферов. Последовательность выходных байтов записывается в буфер байтов или в серии таких буферов. Кодировщик всегда должен использоваться, выполняя следующую последовательность вызовов методов, далее называемых операцией кодирования:
Сбросьте кодировщик с помощью метода
reset, если он не был использован ранее;Вызовите метод
encodeноль или более раз, пока доступен дополнительный ввод, передаваяfalseдля аргументаendOfInputи заполняя буфер ввода и очищая буфер вывода между вызовами;Вызовите метод
encodeодин раз, передаваяtrueдля аргументаendOfInput; и затемВызовите метод
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