Class UTF32Reader

java.lang.Object
java.io.Reader
tools.jackson.core.io.UTF32Reader
All Implemented Interfaces:
Closeable, AutoCloseable, Readable

public class UTF32Reader extends Reader
Since JDK does not come with UTF-32/UCS-4, let's implement a simple decoder to use.
  • Field Details

    • LAST_VALID_UNICODE_CHAR

      protected static final int LAST_VALID_UNICODE_CHAR
      JSON actually limits available Unicode range in the high end to the same as xml (to basically limit UTF-8 max byte sequence length to 4)
      See Also:
    • NC

      protected static final char NC
      See Also:
    • _context

      protected final IOContext _context
    • _in

      protected InputStream _in
    • _autoClose

      private final boolean _autoClose
      Whether underlying InputStream (if any) should be closed when this Reader is closed or not.
    • _buffer

      protected byte[] _buffer
    • _ptr

      protected int _ptr
    • _length

      protected int _length
    • _bigEndian

      protected final boolean _bigEndian
    • _surrogate

      protected char _surrogate
      Although input is fine with full Unicode set, Java still uses 16-bit chars, so we may have to split high-order chars into surrogate pairs.
    • _charCount

      protected int _charCount
      Total read character count; used for error reporting purposes
    • _byteCount

      protected int _byteCount
      Total read byte count; used for error reporting purposes
    • _managedBuffers

      protected final boolean _managedBuffers
    • _tmpBuf

      protected char[] _tmpBuf
  • Constructor Details

    • UTF32Reader

      public UTF32Reader(IOContext ctxt, InputStream in, boolean autoClose, byte[] buf, int ptr, int len, boolean isBigEndian)
  • Method Details

    • close

      public void close() throws IOException
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Specified by:
      close in class Reader
      Throws:
      IOException
    • read

      public int read() throws IOException
      Although this method is implemented by the base class, AND it should never be called by main code, let's still implement it bit more efficiently just in case
      Overrides:
      read in class Reader
      Throws:
      IOException
    • read

      public int read(char[] cbuf, int start, int len) throws IOException
      Specified by:
      read in class Reader
      Throws:
      IOException
    • reportUnexpectedEOF

      private void reportUnexpectedEOF(int gotBytes, int needed) throws IOException
      Throws:
      IOException
    • reportInvalid

      private void reportInvalid(int value, int offset, String msg) throws IOException
      Throws:
      IOException
    • loadMore

      private boolean loadMore(int available) throws IOException
      Parameters:
      available - Number of "unused" bytes in the input buffer
      Returns:
      True, if enough bytes were read to allow decoding of at least one full character; false if EOF was encountered instead.
      Throws:
      IOException
    • freeBuffers

      private void freeBuffers()
      This method should be called along with (or instead of) normal close. After calling this method, no further reads should be tried. Method will try to recycle read buffers (if any).
    • reportBounds

      private void reportBounds(char[] cbuf, int start, int len) throws IOException
      Throws:
      IOException
    • reportStrangeStream

      private void reportStrangeStream() throws IOException
      Throws:
      IOException