Class UTF32Reader

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable, java.lang.Readable

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

      Fields 
      Modifier and Type Field Description
      protected boolean _bigEndian  
      protected byte[] _buffer  
      protected int _byteCount
      Total read byte count; used for error reporting purposes
      protected int _charCount
      Total read character count; used for error reporting purposes
      protected IOContext _context  
      protected java.io.InputStream _in  
      protected int _length  
      protected boolean _managedBuffers  
      protected int _ptr  
      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.
      protected char[] _tmpBuf  
      protected static 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)
      protected static char NC  
      • Fields inherited from class java.io.Reader

        lock
    • Constructor Summary

      Constructors 
      Constructor Description
      UTF32Reader​(IOContext ctxt, java.io.InputStream in, byte[] buf, int ptr, int len, boolean isBigEndian)  
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void close()  
      int read()
      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
      int read​(char[] cbuf, int start, int len)  
      • Methods inherited from class java.io.Reader

        mark, markSupported, nullReader, read, read, ready, reset, skip, transferTo
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • 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:
        Constant Field Values
      • _context

        protected final IOContext _context
      • _in

        protected java.io.InputStream _in
      • _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 Detail

      • UTF32Reader

        public UTF32Reader​(IOContext ctxt,
                           java.io.InputStream in,
                           byte[] buf,
                           int ptr,
                           int len,
                           boolean isBigEndian)
    • Method Detail

      • close

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

        public int read()
                 throws java.io.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 java.io.Reader
        Throws:
        java.io.IOException
      • read

        public int read​(char[] cbuf,
                        int start,
                        int len)
                 throws java.io.IOException
        Specified by:
        read in class java.io.Reader
        Throws:
        java.io.IOException