从给定的输入缓冲区中解码尽可能多的字节,把结果写入给定的输出缓冲区。
应该从各缓冲区的当前位置开始进行读取和写入。最多将读取 in.remaining()
个字节,最多将写入 out.remaining()
个字符。前移缓冲区的位置,以反映字节读取和写入字符,但是其标记和界限将无法修改。
除了从输入缓冲区读取字节和向输出缓冲区写入字符,此方法还返回一个 coderresult
对象来描述它终止的原因:
coderresult.underflow
指示已解码尽可能多的输入缓冲区。如果没有进一步的输入,则调用者可以进行到解码操作的下一个步骤。否则,应该使用进一步的输入再次调用此方法。
coderresult.overflow
指示该输出缓冲区中没有足够空间来解码任何更多字节。应该使用具有更多剩余字符的输出缓冲区再次调用此方法。这通常是通过排空输出缓冲区的所有解码字符来完成的。
coderresult#malformedforlength
malformed-input
结果指示已检测到错误输入错误。错误的字节起始于输入缓冲区(可能向前增加)的位置;错误字节数可以通过调用结果对象的 length
方法来确定。这种情况只适用于此解码器的
错误输入的动作
是 codingerroraction.report
的情况下;否则将像请求的那样忽略或替换错误的输入。
unmappable-character
结果指示已检测到不可映射的字符错误。解码不可映射的字符的字节起始于输入缓冲区(可能向前增加)的位置;这种字节的数目可以通过调用结果对象的 length
方法来确定。这种情况只适用于此解码器的
不可映射的字符的动作
是 codingerroraction.report
的情况下;否则将像请求的那样忽略或替换不可映射的字符。
在任一情况下,如果在相同的解码操作中调用此方法,则要注意保留输入缓冲区中剩余的所有字节,以便可提供给下一次调用使用。
endofinput 参数通知此方法除了给定输入缓冲区包含的内容,调用者是否能提供更多的输入。如果可能提供其他的输入,则调用者应该为此参数传递 false;如果不能提供更多的输入,则调用者应该传递 true。实际上在一次调用中传递 false,但后来发现实际上没有更多的输入可用是相当普遍的,这不是错误。但关键是,在此方法的一系列调用中,最后一次调用总是传递 true,这样所有剩余的未解码输入都作为错误输入处理。
此方法通过调用 decodeloop
方法、解释它的结果、处理错误情况并重新调用(如有必要)来完成其工作。
- 参数:
in
- 输入字节缓冲区out
- 输出字符缓冲区endofinput
- 当且仅当调用者除了给定缓冲区中的内容外不提供其他输入字节时才为 true
- 返回:
- 描述终止原因的 coderresult 对象
- 抛出:
illegalstateexception
- 如果解码操作已在进行中并且前面的步骤不是调用 reset
方法,也不是为 endofinput 参数使用 false 来调用此方法,也不是为 endofinput 参数使用 true 来调用此方法,而是一个指示未完成解码操作的返回值
codermalfunctionerror
- 如果对 decodeloop 方法的调用抛出不可预料的异常