所有类


java.nio.charset
类 CharsetDecoder

java.lang.Object
  继承者 java.nio.charset.CharsetDecoder

public abstract class CharsetDecoder
   
   
   
   
   
extends Object

能够把特定 charset 中的字节序列转换成 16 位 Unicode 字符序列的引擎。

输入字节序列由字节缓冲区或一系列这样的缓冲区提供。输出字符序列写入字符缓冲区或一系列这样的缓冲区。应该始终通过下面的方法调用序列使用解码器,下文称为解码操作

  1. 通过 reset 方法重置解码器,除非以前未使用过;

  2. 只要有其他的输入数据就应零次或多次调用 decode,为 endOfInput 参数传递 false,在调用之间填充输入缓冲区并刷新输出缓冲区。

  3. 最后时刻调用一次 decode 方法,为 endOfInput 参数传递 true;然后

  4. 调用 flush 方法,这样解码器能够将任何内部状态刷新到输出缓冲区。

每次调用 decode 方法将解码尽可能多的输入缓冲区中的字节,将得到的字符写入输出缓冲区。当需要更多的输入时、输出缓冲区没有足够的空间或出现解码错误时,decode 方法返回。在每种情况下都返回用于描述终止原因的 CoderResult 对象。调用者可根据相应的状况检查此对象并填充输入缓冲区、刷新输出缓冲区或尝试从解码错误中恢复,并再次进行尝试。

有两种常规解码错误类型。如果输入字节序列对此 charset 来说是不合法的,那么就认为输入是错误的。如果输入字节序列是合法的,但不能映射为有效的 Unicode 字符,那么就出现了不可映射的字符

如何处理解码错误取决于为该错误类型所请求的操作,在 CodingErrorAction 类的实例中描述了该类型的错误。可能的错误操作是忽略错误的输入、通过返回的 CoderResult 对象将错误报告给调用者,或者用当前的替换字符串值CodingErrorAction#REPLACE替换错误的输入。 该替换字符串的初始值是 "FD"; 可通过 replaceWith 方法更改此值。

对于错误输入和不可映射的字符错误的默认操作是报告它们。可通过 onMalformedInput 方法更改针对错误输入的错误操作;可通过 onUnmappableCharacter 方法更改不可映射字符错误的操作。

此类设计用来处理解码过程中的许多细节问题,包括错误操作的实现。一个特定 charset 的解码器是此类的具体子类,它只需要实现抽象的 decodeLoop 方法,这个方法封装了基本的解码循环。另外,维护内部状态的子类应该重写 flushreset 方法。

此类的实例用于多个并发线程是不安全的。

从以下版本开始:
1.4
另请参见:
ByteBuffer, CharBuffer, Charset, CharsetEncoder

构造方法摘要
protected CharsetDecoder(Charset cs, float averageCharsPerByte, float maxCharsPerByte)
          初始化新的解码器。
 
方法摘要
 floataverageCharsPerByte()
          返回为每个输入字节生成的平均字符数。
 Charsetcharset()
          返回创建此解码器的 charset。
 CharBufferdecode(ByteBuffer in)
          把单个输入字节缓冲区的剩余内容解码到新分配的字符缓冲区的便捷方法。
 CoderResultdecode(ByteBuffer in, CharBuffer out, boolean endOfInput)
          从给定的输入缓冲区中解码尽可能多的字节,把结果写入给定的输出缓冲区。
protected abstract  CoderResultdecodeLoop(ByteBuffer in, CharBuffer out)
          将一个或多个字节解码为一个或多个字符。
 CharsetdetectedCharset()
          检索此解码器检测到的 charset(可选操作)
 CoderResultflush(CharBuffer out)
          刷新此解码器。
protected  CoderResultimplFlush(CharBuffer out)
          刷新此解码器。
protected  voidimplOnMalformedInput(CodingErrorAction newAction)
          报告此解码器的错误输入操作的更改。
protected  voidimplOnUnmappableCharacter(CodingErrorAction newAction)
          报告此解码器的不可映射的字符操作的更改。
protected  voidimplReplaceWith(String newReplacement)
          报告此解码器替换值的更改。
protected  voidimplReset()
          重置此解码器,清除所有特定于 charset 的内部状态。
 booleanisAutoDetecting()
          通知此解码器是否实现了自动检测 charset。
 booleanisCharsetDetected()
          通知此解码器是否已经检测到了一个 charset(可选操作)
 CodingErrorActionmalformedInputAction()
          返回此解码器对错误输入错误的当前操作。
 floatmaxCharsPerByte()
          返回为每个输入字节生成的最大字符数。
 CharsetDecoderonMalformedInput(CodingErrorAction newAction)
          更改此解码器对错误输入错误的操作。
 CharsetDecoderonUnmappableCharacter(CodingErrorAction newAction)
          更改此解码器对不可映射的字符错误的操作。
 Stringreplacement()
          返回此解码器的替换值。
 CharsetDecoderreplaceWith(String newReplacement)
          更改此解码器的替换值。
 CharsetDecoderreset()
          重置此解码器,清除所有内部状态。
 CodingErrorActionunmappableCharacterAction()
          返回此解码器对不可映射的字符错误的当前操作。
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

CharsetDecoder

protected CharsetDecoder(Charset cs,
                         float averageCharsPerByte,
                         float maxCharsPerByte)
初始化新的解码器。新的解码器具有给定的每字节多少个字符 (chars-per-byte) 值,它的替换值是字符串 "\uFFFD"

参数:
averageCharsPerByte - 一个正的 float 值,指示为每个输入字节所生成的字符数
maxCharsPerByte - 一个正的 float 值,指示为每个输入字节所生成的最大字符数
抛出:
IllegalArgumentException - 如果参数有关的前提不成立
方法详细信息

charset

public final Charset charset()
返回创建此解码器的 charset。

返回:
此解码器的 charset

replacement

public final String replacement()
返回此解码器的替换值。

返回:
返回此解码器的当前替换值,它永远不能为 null,也不能为空

replaceWith

public final CharsetDecoder replaceWith(String newReplacement)
更改此解码器的替换值。

此方法调用 implReplaceWith 方法,检查新的替换值是可接受的后,传递该新替换值。

参数:
newReplacement - 新替换值;一定不能为 null 且长度必须为非零
返回:
此解码器
抛出:
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)
报告此解码器的错误输入操作的更改。

此方法的默认实现不执行任何操作。需要通知错误输入操作更改的解码器应该重写此方法。