public abstract class CharsetDecoder extends Object
输入字节序列是提供在一个字节缓冲区或一系列这样的缓冲区。输出字符序列被写入到一个字符缓冲区或一系列这样的缓冲区。解码器应该做如下的方法调用序列,以下简称解码操作:
复位解码器通过reset
方法,除非它没有被使用过;
调用decode
方法零次或更多次,只要额外的输入可能是可用的,通过false为endOfInput论点和填充输入缓冲和冲洗之间的调用的输出缓冲器;
decode
方法调用的最后一次,为endOfInput参数传递true;然后
调用flush
方法使解码器可以将任何内部状态到输出缓冲区。
decode
方法将解码尽可能多的字节从输入缓冲区,写相应的字符到输出缓冲区。的
decode
方法返回时更多的投入是必须的,当没有在输出缓冲区足够的空间,或当一个解码错误已经发生。在每一种情况下,
CoderResult
对象返回描述终止原因。调用者可以检查该对象和填充输入缓冲,刷新输出缓冲区,或试图从解码错误,恢复适当的,并再次尝试。
有两种类型的解码错误。如果输入字节序列是不合法的这个字符然后输入是畸形。如果输入字节序列是合法的但不能被映射到一个有效的Unicode字符,然后无法映射的字符已经遇到。
如何解码错误处理取决于所要求的那种错误的行动,这是由其CodingErrorAction
类的一个实例描述。可能的错误行为是ignore错误输入,report错误的调用通过返回的CoderResult
对象,或replace错误输入替换字符串的当前值。更换具有初始值"\uFFFD";它的值可以通过replaceWith
方法改变。
对于错误的输入,无法映射的字符错误的默认动作是report他们。畸形的输入误差的作用可能是通过onMalformedInput
方法改变的行动;无法映射的字符可以通过onUnmappableCharacter
方法改变。
这个类的设计是为了处理解码过程中的许多细节,包括错误操作的实现。一个特定的字符编码解码器,它是这个类的一个具体子类,只需要实现抽象decodeLoop
方法,它封装了基本的解码环。一类维护内部状态,此外,覆盖implFlush
和implReset
方法。
这个类的实例不安全使用多个并发线程。
ByteBuffer
,
CharBuffer
,
Charset
,
CharsetEncoder
Modifier | Constructor and Description |
---|---|
protected |
CharsetDecoder(Charset cs, float averageCharsPerByte, float maxCharsPerByte)
初始化一个新的解码器。
|
Modifier and Type | Method and Description |
---|---|
float |
averageCharsPerByte()
返回将为每个输入的每个字节产生的字符的平均数。
|
Charset |
charset()
返回创建此解码器的字符集。
|
CharBuffer |
decode(ByteBuffer in)
方便的方法,将一个单输入字节缓冲区剩余内容到新分配的字符缓冲区。
|
CoderResult |
decode(ByteBuffer in, CharBuffer out, boolean endOfInput)
将尽可能多的字节从给定的输入缓冲区,将结果写入给定的输出缓冲器。
|
protected abstract CoderResult |
decodeLoop(ByteBuffer in, CharBuffer out)
将一个或多个字节为一个或多个字符。
|
Charset |
detectedCharset()
检索字符集是由该解码器 检测(可选操作)。
|
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()
返回错误的输入错误该解码器的动作。
|
float |
maxCharsPerByte()
返回将为每个输入的每个字节产生的最大字符数。
|
CharsetDecoder |
onMalformedInput(CodingErrorAction newAction)
改变这个解码器的行动为畸形的输入错误。
|
CharsetDecoder |
onUnmappableCharacter(CodingErrorAction newAction)
改变这个解码器的作用无法映射的字符错误。
|
String |
replacement()
返回此解码器的替换值。
|
CharsetDecoder |
replaceWith(String newReplacement)
更改此解码器的替换值。
|
CharsetDecoder |
reset()
重置该解码器,清除任何内部状态。
|
CodingErrorAction |
unmappableCharacterAction()
返回无法映射的字符错误这个解码器的动作电流。
|
protected CharsetDecoder(Charset cs, float averageCharsPerByte, float maxCharsPerByte)
cs
-创建此解码器的字符集
averageCharsPerByte
-正浮点数表示预期的字符数,将为每个输入字节
maxCharsPerByte
-正浮点数表示的最大字符数,将为每个输入字节
IllegalArgumentException
-如果在参数的前提条件不成立
public final Charset charset()
public final String replacement()
public final CharsetDecoder replaceWith(String newReplacement)
此方法调用implReplaceWith
方法,通过新的替换,在检验新的替换是可以接受的。
newReplacement
的重置价值新更换的;不能
null必须有非零的长度
IllegalArgumentException
-如果在参数的前提条件不成立
protected void implReplaceWith(String newReplacement)
这种方法的默认实现不做任何事。这种方法应该由解码器需要更换变更通知重写。
newReplacement
-重置价值
public CodingErrorAction malformedInputAction()
public final CharsetDecoder onMalformedInput(CodingErrorAction newAction)
此方法调用implOnMalformedInput
方法,通过新的行动。
newAction
-新的行动;不能
null
IllegalArgumentException
-如果在参数的前提不成立
protected void implOnMalformedInput(CodingErrorAction newAction)
这种方法的默认实现不做任何事。这种方法应该由解码器需要的格式不正确的输入动作变化通知重写。
newAction
-新的行动
public CodingErrorAction unmappableCharacterAction()
public final CharsetDecoder onUnmappableCharacter(CodingErrorAction newAction)
此方法调用implOnUnmappableCharacter
方法,通过新的行动。
newAction
-新的行动;不能
null
IllegalArgumentException
-如果在参数的前提不成立
protected void implOnUnmappableCharacter(CodingErrorAction newAction)
这种方法的默认实现不做任何事。这种方法应该由解码器需要到无法映射的字符的动作变化通知重写。
newAction
-新的行动
public final float averageCharsPerByte()
public final float maxCharsPerByte()
public final CoderResult decode(ByteBuffer in, CharBuffer out, boolean endOfInput)
缓冲区被读取,并写入,开始在他们目前的位置。在最in.remaining()
字节将被阅读最多out.remaining()
字符将被写入。缓冲区的位置将是先进的,以反映字节读和写的字符,但他们的标志和限制将不会被修改。
除了从输入缓冲区和文字到输出缓冲区中读取字节,此方法返回一个CoderResult
对象描述其终止的原因:
CoderResult.UNDERFLOW
显示尽可能多的输入缓冲器被解码。如果没有进一步的输入,然后调用程序,可以进行下一步的decoding operation。否则,该方法将再次被调用以进一步输入。
CoderResult.OVERFLOW
表明输出缓冲解码任何更多的字节空间不够。这种方法应该被调用了输出缓冲区,更remaining字符。这通常是通过耗尽输出缓冲区中的任何解码字符来完成的。
一个malformed-input结果表明检测到错误的输入错误。在输入缓冲区中的字节开始畸形(可能是递增的)位置;畸形的字节数可以通过调用对象的length
法测定结果。如果此解码器的malformed action是CodingErrorAction.REPORT
本案适用;否则,错误的输入将被忽略或更换,按要求。
一个unmappable-character结果表明检测到一个无法映射的字符错误。字节解码无法映射的字符在输入缓冲区的开始位置(可能是递增的);这样的字节数可以通过调用对象的length
法测定结果。如果此解码器的unmappable action是CodingErrorAction.REPORT
本案适用;否则无法映射的字符将被忽略,或更换,按要求。
的endOfInput参数建议此方法的调用者是否可以提供进一步的输入超出包含在给定的输入缓冲器。如果有可能提供额外的输入,然后调用程序应该通过false这个参数;如果不可能提供进一步的输入,然后调用应该通过true。它不是错误的,事实上这是很常见的,在一个调用通过false后来发现没有进一步的输入实际上是可用的。然而,这是至关重要的,,,在一系列的调用这个方法的调用都通过true最终使剩余的未解码的输入将被视为畸形。
该方法通过调用decodeLoop
方法,解释其结果,处理错误条件,并reinvoking这是必要的。
in
-输入字节缓冲区
out
-输出字符缓冲区
endOfInput
-
true如果,仅仅如果调用者可以提供任何额外的输入字节超过给定的缓冲区
IllegalStateException
如果解码操作已在进行中,前一步是调用的方法也不
reset
,这种方法对
endOfInput参数值
false,也没有这种方法对
endOfInput参数值
true但返回值指示一个不完整的解码操作
CoderMalfunctionError
的decodeloop方法调用抛出异常
public final CoderResult flush(CharBuffer out)
一些解码器保持内部状态,一旦输入序列已读过,可能需要将一些最终的字符写入输出缓冲区。
任何额外的输出写入到输出缓冲区开始在其当前位置。在最out.remaining()
字符将被写入。缓冲区的位置将适当提前,但它的标记和限制将不会被修改。
如果此方法成功完成,则返回CoderResult.UNDERFLOW
。如果在输出缓冲区空间不足则返回CoderResult.OVERFLOW
。如果发生这种情况,那么这个方法必须调用一次,与一个输出缓冲区,有更多的空间,为了完成当前的decoding operation。
如果这个解码器已经被刷新,那么调用这个方法没有任何效果。
此方法调用implFlush
方法来执行实际的冲洗操作。
out
-输出字符缓冲区
CoderResult.UNDERFLOW
或
CoderResult.OVERFLOW
IllegalStateException
-如果当前解码操作之前的步骤被调用的方法不
flush
的三参数
decode
方法为
endOfInput参数值
true
protected CoderResult implFlush(CharBuffer out)
这种方法的默认实现不执行任何操作,并且总是返回CoderResult.UNDERFLOW
。这种方法应该由解码器可能需要写最后的字符到输出缓冲区一旦整个输入序列已读重写。
out
-输出字符缓冲区
CoderResult.UNDERFLOW
或
CoderResult.OVERFLOW
public final CharsetDecoder reset()
这个方式将字符集的独立国家并调用implReset
方法以执行任何字符集的特定的复位动作。
protected void implReset()
这种方法的默认实现不做任何事。这种方法应该通过保持内部状态译码器重写。
protected abstract CoderResult decodeLoop(ByteBuffer in, CharBuffer out)
这种方法封装的基本解码回路,解码尽可能多的字节直到它运行的输入,跑出房间在输出缓冲区,或遇到一个解码错误。该方法由decode
方法调用时,处理结果解释和错误恢复。
缓冲区被读取,并写入,开始在他们目前的位置。在最in.remaining()
字节将被读取,并在最out.remaining()
字符将被写入。缓冲区的位置将是先进的,以反映字节读和写的字符,但他们的标志和限制将不会被修改。
此方法返回一个CoderResult
对象描述其终止的原因,以同样的方式为decode
方法。大多数这种方法实现将处理由decode
方法返回一个合适的对象错误解码结果解释。一个优化的实现可能会检查相关的错误动作,并实现行动本身。
此方法的实现可以执行任意的先行返回CoderResult.UNDERFLOW
直到它接收到足够的输入。
in
-输入字节缓冲区
out
-输出字符缓冲区
public final CharBuffer decode(ByteBuffer in) throws CharacterCodingException
该方法实现了一个完整的decoding operation;即它重置该解码器,然后将字节给定的字节缓冲区,最后冲这个解码器。因此,如果一个解码操作已经在进行中,该方法不应该被调用。
in
-输入字节缓冲区
IllegalStateException
如果解码操作已在进行中
MalformedInputException
如果字节序列从输入缓冲区中的当前位置是不合法的这个字符集和当前畸形的输入动作
CodingErrorAction.REPORT
UnmappableCharacterException
如果字节序列从输入缓冲区中的当前位置不能映射到等效的字符序列,目前无法映射的字符的作用是
CodingErrorAction.REPORT
CharacterCodingException
public boolean isAutoDetecting()
此方法的默认实现总是返回false;应该以自动检测解码器返回true重写。
public boolean isCharsetDetected()
如果这个解码器实现了自动检测然后在一个单点的字符集解码操作过程中,这种方法可能开始返回true表明一个特定的字符已经输入字节序列检测。一旦发生这种情况,这detectedCharset
方法可以调用以检索到的字符集。
此方法返回false并不意味着没有字节尚未解码。一些汽车检测解码器能够解码部分,甚至全部,一个输入字节序列没有固定在一个特定的字符集。
此方法的默认实现总是抛出一个UnsupportedOperationException
;应该以自动检测解码器一旦输入字符集已经确定true返回重写。
UnsupportedOperationException
-如果这个解码器不执行字符集的自动检测
public Charset detectedCharset()
如果这个解码器实现了自动检测字符然后这个方法返回的实际字符一旦被检测到。在这一点之后,此方法返回当前解码操作的持续时间相同的值。如果没有足够的输入字节尚未读来确定实际的字符然后该方法抛出一个IllegalStateException
。
此方法的默认实现总是抛出一个UnsupportedOperationException
;应该以自动检测解码器返回相应的值覆盖。
IllegalStateException
字节已读来确定字符集
UnsupportedOperationException
-如果这个解码器不执行字符集的自动检测
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.