Класс 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 или заменить ошибочный вход текущим значением массива байтов замены. Значение замены по умолчанию устанавливается для кодировщика, который часто (но не всегда) имеет начальное значение { (byte)'?' }; его значение можно изменить с помощью метода replaceWith.
По умолчанию действия при ошибках неправильного ввода и неотображаемых символов — сообщить о них. Действие при ошибке неправильного ввода можно изменить с помощью метода onMalformedInput; действие при ошибке неотображаемого символа можно изменить с помощью метода onUnmappableCharacter.
Этот класс предназначен для обработки многих деталей процесса кодирования, включая реализацию действий при ошибках. Кодировщику для определенной кодировки, который является конкретным подклассом этого класса, необходимо только реализовать абстрактный метод encodeLoop, который обобщает основной цикл кодирования. Подкласс, который сохраняет внутреннее состояние, должен дополнительно переопределить методы implFlush и implReset.
Экземпляры этого класса не безопасны для использования в нескольких потоках одновременно.
- С момента:
- 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если и только если вызывающий объект не может предоставить дополнительные входные символы, помимо тех, которые находятся в заданном буфере - Возвращает:
- Объект coder-result, описывающий причину завершения
- Исключения:
-
IllegalStateException- Если операция кодирования уже выполняется, и предыдущий шаг был вызовом ни методаreset, ни этого метода со значениемfalseдля параметраendOfInput, ни этого метода со значениемtrueдля параметраendOfInput, но возвращаемое значение указывает на незавершенную операцию кодирования -
CoderMalfunctionError- Если вызов метода encodeLoop вызвал непредвиденное исключение
flush
public final CoderResult flush(ByteBuffer out)
Очищает этот кодировщик.
Некоторые кодировщики сохраняют внутреннее состояние и могут потребовать записи некоторых конечных байтов в буфер вывода после того, как вся последовательность входных данных была прочитана.
Любой дополнительный вывод записывается в буфер вывода, начиная с его текущей позиции. Будет записано не более out.remaining() байтов. Позиция буфера будет соответствующим образом продвинута, но метка и предел не будут изменены.
Если этот метод завершился успешно, то он возвращает CoderResult.UNDERFLOW. Если в буфере вывода недостаточно места, то он возвращает CoderResult.OVERFLOW. В этом случае этот метод необходимо вызвать снова с буфером вывода, в котором есть больше места, для завершения текущей операции кодирования.
Если этот кодировщик уже очищен, то вызов этого метода не оказывает никакого влияния.
Этот метод вызывает метод implFlush для выполнения фактической операции очистки.
- Параметры:
-
out- Буфер выходных байтов - Возвращает:
- Объект coder-result, либо
CoderResult.UNDERFLOW, либоCoderResult.OVERFLOW - Исключения:
-
IllegalStateException- Если предыдущий шаг текущей операции кодирования был вызовом ни методаflush, ни трехаргументного методаencodeсо значениемtrueдля параметраendOfInput
implFlush
protected CoderResult implFlush(ByteBuffer out)
Очищает этот кодировщик.
По умолчанию этот метод ничего не делает и всегда возвращает CoderResult.UNDERFLOW. Этот метод должен быть переопределён кодировщиками, которые могут потребовать записи конечных байтов в буфер вывода после того, как вся последовательность входных данных была прочитана.
- Параметры:
-
out- Буфер выходных байтов - Возвращает:
- Объект coder-result, либо
CoderResult.UNDERFLOW, либоCoderResult.OVERFLOW
reset
public final CharsetEncoder reset()
Сбрасывает этот кодировщик, очищая любое внутреннее состояние.
Этот метод сбрасывает состояние, не зависящее от кодировки, а также вызывает метод implReset для выполнения любых действий по сбросу, специфичных для кодировки.
- Возвращает:
- Этот кодировщик
implReset
protected void implReset()
Сбрасывает этот кодировщик, очищая любое внутреннее состояние, специфичное для кодировки.
По умолчанию этот метод ничего не делает. Этот метод должен быть переопределен кодировщиками, которые сохраняют внутреннее состояние.
encodeLoop
protected abstract CoderResult encodeLoop(CharBuffer in,
ByteBuffer out) Кодирует один или несколько символов в один или несколько байтов.
Этот метод encapsulates основной цикл кодирования, кодируя как можно больше символов, пока не исчерпаются входные данные, не закончится место в буфере вывода или не произойдет ошибка кодирования. Этот метод вызывается методом encode, который обрабатывает интерпретацию результатов и восстановление от ошибок.
Буферы считываются и записываются, начиная с текущих позиций. Будет прочитано не более in.remaining() символов, и будет записано не более out.remaining() байтов. Позиции буферов будут продвинуты, чтобы отразить прочитанные символы и записанные байты, но метки и пределы не будут изменены.
Этот метод возвращает объект CoderResult для описания причины завершения, так же как метод encode. Большинство реализаций этого метода будут обрабатывать ошибки кодирования, возвращая соответствующий объект результата для интерпретации методом encode. Оптимизированная реализация может вместо этого проверить соответствующее действие с ошибкой и реализовать это действие сама.
Реализация этого метода может выполнять произвольный просмотр вперёд, возвращая CoderResult.UNDERFLOW, пока не получит достаточных входных данных.
- Параметры:
-
in- Буфер входных символов -
out- Буфер выходных байтов - Возвращает:
- Объект coder-result, описывающий причину завершения
encode
public final ByteBuffer encode(CharBuffer in)
throws CharacterCodingException Удобный метод, который кодирует оставшееся содержимое одного входного буфера символов в новый выделенный буфер байтов.
Этот метод реализует всю операцию кодирования; то есть, он сбрасывает этот кодировщик, затем кодирует символы в заданном буфере символов и, наконец, очищает этот кодировщик. Следовательно, этот метод не следует вызывать, если операция кодирования уже выполняется.
- Параметры:
-
in- Буфер входных символов - Возвращает:
- Новый выделенный буфер байтов, содержащий результат операции кодирования. Позиция буфера будет равна нулю, а его предел будет следовать за последним записанным байтом.
- Исключения:
-
IllegalStateException- Если операция кодирования уже выполняется -
MalformedInputException- Если последовательность символов, начиная с текущей позиции входного буфера, не является допустимой шестнадцатибитной последовательностью Unicode, а текущее действие неверно-форматированного ввода равно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.