Class UTF8Reader
- java.lang.Object
-
- java.io.Reader
-
- com.fasterxml.jackson.dataformat.yaml.UTF8Reader
-
- All Implemented Interfaces:
java.io.Closeable,java.lang.AutoCloseable,java.lang.Readable
public final class UTF8Reader extends java.io.ReaderOptimized Reader that reads UTF-8 encoded content from an input stream. In addition to doing (hopefully) optimal conversion, it can also take array of "pre-read" (leftover) bytes; this is necessary when preliminary stream/reader is trying to figure out underlying character encoding.
-
-
Field Summary
Fields Modifier and Type Field Description private boolean_autoCloseprotected byte[][]_bufferHolderprotected static java.lang.ThreadLocal<java.lang.ref.SoftReference<byte[][]>>_bufferRecyclerThisThreadLocalcontains aSoftReferenceto a byte array used for holding content to decode(package private) int_byteCountTotal read byte count; used for error reporting purposes(package private) int_charCountTotal read character count; used for error reporting purposesprotected byte[]_inputBufferprotected int_inputEndPointed to the end marker, that is, position one after the last valid available byte.protected int_inputPtrPointer to the next available byte (if any), iff less thanmByteBufferEndprivate java.io.InputStream_inputSourceprotected int_surrogateDecoded first character of a surrogate pair, if one needs to be bufferedprivate char[]_tmpBufferprivate static intDEFAULT_BUFFER_SIZE
-
Constructor Summary
Constructors Constructor Description UTF8Reader(byte[] buf, int ptr, int len, boolean autoClose)UTF8Reader(java.io.InputStream in, boolean autoClose)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private static byte[][]_findBufferHolder()protected booleancanModifyBuffer()Method that can be used to see if we can actually modify the underlying buffer.voidclose()voidfreeBuffers()This method should be called along with (or instead of) normal close.protected java.io.InputStreamgetStream()private booleanloadMore(int available)intread()Although this method is implemented by the base class, AND it should never be called by Woodstox code, let's still implement it bit more efficiently just in caseintread(char[] cbuf)intread(char[] cbuf, int start, int len)protected intreadBytes()Method for reading as many bytes from the underlying stream as possible (that fit in the buffer), to the beginning of the buffer.protected intreadBytesAt(int offset)Method for reading as many bytes from the underlying stream as possible (that fit in the buffer considering offset), to the specified offset.protected voidreportBounds(char[] cbuf, int start, int len)private voidreportInvalidInitial(int mask, int offset)private voidreportInvalidOther(int mask, int offset)protected voidreportStrangeStream()private voidreportUnexpectedEOF(int gotBytes, int needed)
-
-
-
Field Detail
-
DEFAULT_BUFFER_SIZE
private static final int DEFAULT_BUFFER_SIZE
- See Also:
- Constant Field Values
-
_bufferRecycler
protected static final java.lang.ThreadLocal<java.lang.ref.SoftReference<byte[][]>> _bufferRecycler
ThisThreadLocalcontains aSoftReferenceto a byte array used for holding content to decode
-
_bufferHolder
protected final byte[][] _bufferHolder
-
_inputSource
private java.io.InputStream _inputSource
-
_autoClose
private final boolean _autoClose
-
_inputBuffer
protected byte[] _inputBuffer
-
_inputPtr
protected int _inputPtr
Pointer to the next available byte (if any), iff less thanmByteBufferEnd
-
_inputEnd
protected int _inputEnd
Pointed to the end marker, that is, position one after the last valid available byte.
-
_surrogate
protected int _surrogate
Decoded first character of a surrogate pair, if one needs to be buffered
-
_charCount
int _charCount
Total read character count; used for error reporting purposes
-
_byteCount
int _byteCount
Total read byte count; used for error reporting purposes
-
_tmpBuffer
private char[] _tmpBuffer
-
-
Method Detail
-
_findBufferHolder
private static byte[][] _findBufferHolder()
-
canModifyBuffer
protected final boolean canModifyBuffer()
Method that can be used to see if we can actually modify the underlying buffer. This is the case if we are managing the buffer, but not if it was just given to us.
-
close
public void close() throws java.io.IOException- Specified by:
closein interfacejava.lang.AutoCloseable- Specified by:
closein interfacejava.io.Closeable- Specified by:
closein classjava.io.Reader- Throws:
java.io.IOException
-
read
public int read() throws java.io.IOExceptionAlthough this method is implemented by the base class, AND it should never be called by Woodstox code, let's still implement it bit more efficiently just in case- Overrides:
readin classjava.io.Reader- Throws:
java.io.IOException
-
read
public int read(char[] cbuf) throws java.io.IOException- Overrides:
readin classjava.io.Reader- Throws:
java.io.IOException
-
read
public int read(char[] cbuf, int start, int len) throws java.io.IOException- Specified by:
readin classjava.io.Reader- Throws:
java.io.IOException
-
getStream
protected final java.io.InputStream getStream()
-
readBytes
protected final int readBytes() throws java.io.IOExceptionMethod for reading as many bytes from the underlying stream as possible (that fit in the buffer), to the beginning of the buffer.- Returns:
- Number of bytes read, if any; -1 for end-of-input.
- Throws:
java.io.IOException
-
readBytesAt
protected final int readBytesAt(int offset) throws java.io.IOExceptionMethod for reading as many bytes from the underlying stream as possible (that fit in the buffer considering offset), to the specified offset.- Returns:
- Number of bytes read, if any; -1 to indicate none available (that is, end of input)
- Throws:
java.io.IOException
-
freeBuffers
public final 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).
-
reportInvalidInitial
private void reportInvalidInitial(int mask, int offset) throws java.io.IOException- Throws:
java.io.IOException
-
reportInvalidOther
private void reportInvalidOther(int mask, int offset) throws java.io.IOException- Throws:
java.io.IOException
-
reportUnexpectedEOF
private void reportUnexpectedEOF(int gotBytes, int needed) throws java.io.IOException- Throws:
java.io.IOException
-
loadMore
private boolean loadMore(int available) throws java.io.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:
java.io.IOException
-
reportBounds
protected void reportBounds(char[] cbuf, int start, int len) throws java.io.IOException- Throws:
java.io.IOException
-
reportStrangeStream
protected void reportStrangeStream() throws java.io.IOException- Throws:
java.io.IOException
-
-