public void read(Appendable dest) throws IOException {
  if (_inputStream == null)   throw new IOException("No input stream or stream closed");
  while (true) {
    if (_start >= _end) {
      _start=0;
      _end=_inputStream.read(_bytes,0,_bytes.length);
      if (_end <= 0) {
        break;
      }
    }
    byte b=_bytes[_start];
    if (b >= 0) {
      dest.append((char)b);
      _start++;
    }
 else {
      int code=read2();
      if (code < 0x10000) {
        dest.append((char)code);
      }
 else       if (code <= 0x10ffff) {
        dest.append((char)(((code - 0x10000) >> 10) + 0xd800));
        dest.append((char)(((code - 0x10000) & 0x3ff) + 0xdc00));
      }
 else {
        throw new CharConversionException("Cannot convert U+" + Integer.toHexString(code) + " to char (code greater than U+10FFFF)");
      }
    }
  }
}

public void read ( Appendable dest ) throws IOException { if ( _inputStream == null ) throw new IOException ( "No input stream or stream closed" ) ; while ( true ) { if ( _start >= _end ) { _start = 0 ; _end = _inputStream . read ( _bytes , 0 , _bytes . length ) ; if ( _end <= 0 ) { break ; } } byte b = _bytes [ _start ] ; if ( b >= 0 ) { dest . append ( ( char ) b ) ; _start ++ ; } else { int code = read2 ( ) ; if ( code < 0x10000 ) { dest . append ( ( char ) code ) ; } else if ( code <= 0x10ffff ) { dest . append ( ( char ) ( ( ( code - 0x10000 ) > > 10 ) + 0xd800 ) ) ; dest . append ( ( char ) ( ( ( code - 0x10000 ) & 0x3ff ) + 0xdc00 ) ) ; } else { throw new CharConversionException ( "Cannot convert U+" + Integer . toHexString ( code ) + " to char (code greater than U+10FFFF)" ) ; } } } }
reads characters into the specified appendable . this method will block until the end of the stream is reached .
