Class ReaderInputStream
- All Implemented Interfaces:
Closeable,AutoCloseable
InputStream implementation that reads a character stream from a Reader and transforms it to a byte stream using a specified charset encoding.
The stream is transformed using a CharsetEncoder object, guaranteeing that all charset encodings supported by the JRE are handled correctly. In
particular for charsets such as UTF-16, the implementation ensures that one and only one byte order marker is produced.
Since in general it is not possible to predict the number of characters to be read from the Reader to satisfy a read request on the
ReaderInputStream, all reads from the Reader are buffered. There is therefore no well defined correlation between the current position of the
Reader and that of the ReaderInputStream. This also implies that in general there is no need to wrap the underlying Reader in a
BufferedReader.
ReaderInputStream implements the inverse transformation of InputStreamReader; in the following example, reading from in2
would return the same byte sequence as reading from in (provided that the initial byte sequence is legal with respect to the charset encoding):
To build an instance, use ReaderInputStream.Builder.
InputStream inputStream = ... Charset cs = ... InputStreamReader reader = new InputStreamReader(inputStream, cs); ReaderInputStream in2 = ReaderInputStream.builder() .setReader(reader) .setCharset(cs) .get();
ReaderInputStream implements the same transformation as OutputStreamWriter, except that the control flow is reversed: both classes
transform a character stream into a byte stream, but OutputStreamWriter pushes data to the underlying stream, while ReaderInputStream
pulls it from the underlying stream.
Note that while there are use cases where there is no alternative to using this class, very often the need to use this class is an indication of a flaw in
the design of the code. This class is typically used in situations where an existing API only accepts an InputStream, but where the most natural way
to produce the data is as a character stream, by providing a Reader instance. An example of a situation where this problem may appear is when
implementing the javax.activation.DataSource interface from the Java Activation Framework.
The available() method of this class always returns 0. The methods InputStream.mark(int) and InputStream.reset() are not supported.
Instances of ReaderInputStream are not thread safe.
- Since:
- 2.0
- See Also:
-
Nested Class Summary
Nested Classes -
Constructor Summary
ConstructorsConstructorDescriptionReaderInputStream(Reader reader) Deprecated.ReaderInputStream(Reader reader, String charsetName) Deprecated.Usebuilder()insteadReaderInputStream(Reader reader, String charsetName, int bufferSize) Deprecated.Usebuilder()insteadReaderInputStream(Reader reader, Charset charset) Deprecated.Usebuilder()instead, will be protected for subclasses.ReaderInputStream(Reader reader, CharsetEncoder charsetEncoder) Deprecated.Usebuilder()insteadReaderInputStream(Reader reader, CharsetEncoder charsetEncoder, int bufferSize) Deprecated.Usebuilder()insteadReaderInputStream(Reader reader, Charset charset, int bufferSize) Deprecated.Usebuilder()instead -
Method Summary
Modifier and TypeMethodDescriptionintstatic ReaderInputStream.Builderbuilder()Constructs a newReaderInputStream.Builder.voidclose()Closes the stream.intread()Reads a single byte.intread(byte[] b) Reads the specified number of bytes into an array.intread(byte[] array, int off, int len) Reads the specified number of bytes into an array.Methods inherited from class org.apache.commons.io.input.AbstractInputStream
isClosed, setClosedMethods inherited from class java.io.InputStream
mark, markSupported, reset, skip
-
Constructor Details
-
ReaderInputStream
Deprecated.Usebuilder()insteadConstructs a newReaderInputStreamthat uses the virtual machine'sdefault charsetwith a default input buffer size of 8192 characters.- Parameters:
reader- the targetReader
-
ReaderInputStream
Deprecated.Usebuilder()instead, will be protected for subclasses.Constructs a newReaderInputStreamwith a default input buffer size of 8192 characters.The encoder created for the specified charset will use
CodingErrorAction.REPLACEfor malformed input and unmappable characters.- Parameters:
reader- the targetReadercharset- the charset encoding
-
ReaderInputStream
Deprecated.Usebuilder()insteadConstructs a newReaderInputStream.The encoder created for the specified charset will use
CodingErrorAction.REPLACEfor malformed input and unmappable characters.- Parameters:
reader- the targetReader.charset- the charset encoding.bufferSize- the size of the input buffer in number of characters.
-
ReaderInputStream
Deprecated.Usebuilder()insteadConstructs a newReaderInputStream.This constructor does not call
reseton the provided encoder. The caller of this constructor should do this when providing an encoder which had already been in use.- Parameters:
reader- the targetReadercharsetEncoder- the charset encoder- Since:
- 2.1
-
ReaderInputStream
Deprecated.Usebuilder()insteadConstructs a newReaderInputStream.This constructor does not call
reseton the provided encoder. The caller of this constructor should do this when providing an encoder which had already been in use.- Parameters:
reader- the targetReadercharsetEncoder- the charset encoder, null defaults to the default Charset encoder.bufferSize- the size of the input buffer in number of characters- Since:
- 2.1
-
ReaderInputStream
Deprecated.Usebuilder()insteadConstructs a newReaderInputStreamwith a default input buffer size of 8192 characters.The encoder created for the specified charset will use
CodingErrorAction.REPLACEfor malformed input and unmappable characters.- Parameters:
reader- the targetReadercharsetName- the name of the charset encoding
-
ReaderInputStream
Deprecated.Usebuilder()insteadConstructs a newReaderInputStream.The encoder created for the specified charset will use
CodingErrorAction.REPLACEfor malformed input and unmappable characters.- Parameters:
reader- the targetReadercharsetName- the name of the charset encoding, null maps to the default Charset.bufferSize- the size of the input buffer in number of characters
-
-
Method Details
-
builder
Constructs a newReaderInputStream.Builder.- Returns:
- a new
ReaderInputStream.Builder. - Since:
- 2.12.0
-
available
- Overrides:
availablein classInputStream- Throws:
IOException
-
close
Closes the stream. This method will cause the underlyingReaderto be closed.- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceCloseable- Overrides:
closein classAbstractInputStream- Throws:
IOException- if an I/O error occurs.
-
read
Reads a single byte.- Specified by:
readin classInputStream- Returns:
- either the byte read or
-1if the end of the stream has been reached - Throws:
IOException- if an I/O error occurs.
-
read
Reads the specified number of bytes into an array.- Overrides:
readin classInputStream- Parameters:
b- the byte array to read into- Returns:
- the number of bytes read or
-1if the end of the stream has been reached - Throws:
IOException- if an I/O error occurs.
-
read
Reads the specified number of bytes into an array.- Overrides:
readin classInputStream- Parameters:
array- the byte array to read intooff- the offset to start reading bytes intolen- the number of bytes to read- Returns:
- the number of bytes read or
-1if the end of the stream has been reached - Throws:
IOException- if an I/O error occurs.
-
builder()instead