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):
InputStream in = ... Charset cs = ... InputStreamReader reader = new InputStreamReader(in, cs); ReaderInputStream in2 = new ReaderInputStream(reader, cs);
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, i.e. by providing a Reader
instance. An example of a situation
where this problem may appear is when implementing the DataSource
interface from the JavaBeans Activation Framework.
Given the fact that the Reader
class doesn't provide any way to predict whether the next
read operation will block or not, it is not possible to provide a meaningful
implementation of the InputStream.available()
method. A call to this method
will always return 0. Also, this class doesn't support InputStream.mark(int)
.
Instances of ReaderInputStream
are not thread safe.
- Since:
- Commons IO 2.0
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final int
private final CharsetEncoder
private final CharBuffer
CharBuffer used as input for the decoder.private final ByteBuffer
ByteBuffer used as output for the decoder.private boolean
private CoderResult
private final Reader
-
Constructor Summary
ConstructorsConstructorDescriptionReaderInputStream
(Reader reader) Construct a newReaderInputStream
that uses the default character encoding with a default input buffer size of 1024 characters.ReaderInputStream
(Reader reader, String charsetName) Construct a newReaderInputStream
with a default input buffer size of 1024 characters.ReaderInputStream
(Reader reader, String charsetName, int bufferSize) Construct a newReaderInputStream
.ReaderInputStream
(Reader reader, Charset charset) Construct a newReaderInputStream
with a default input buffer size of 1024 characters.ReaderInputStream
(Reader reader, CharsetEncoder encoder) Construct a newReaderInputStream
.ReaderInputStream
(Reader reader, CharsetEncoder encoder, int bufferSize) Construct a newReaderInputStream
.ReaderInputStream
(Reader reader, Charset charset, int bufferSize) Construct a newReaderInputStream
. -
Method Summary
Methods inherited from class java.io.InputStream
available, mark, markSupported, nullInputStream, readAllBytes, readNBytes, readNBytes, reset, skip, skipNBytes, transferTo
-
Field Details
-
DEFAULT_BUFFER_SIZE
private static final int DEFAULT_BUFFER_SIZE- See Also:
-
reader
-
encoder
-
encoderIn
CharBuffer used as input for the decoder. It should be reasonably large as we read data from the underlying Reader into this buffer. -
encoderOut
ByteBuffer used as output for the decoder. This buffer can be small as it is only used to transfer data from the decoder to the buffer provided by the caller. -
lastCoderResult
-
endOfInput
private boolean endOfInput
-
-
Constructor Details
-
ReaderInputStream
Construct a newReaderInputStream
.- Parameters:
reader
- the targetReader
encoder
- the charset encoder- Since:
- Commons IO 2.1
-
ReaderInputStream
Construct a newReaderInputStream
.- Parameters:
reader
- the targetReader
encoder
- the charset encoderbufferSize
- the size of the input buffer in number of characters- Since:
- Commons IO 2.1
-
ReaderInputStream
Construct a newReaderInputStream
.- Parameters:
reader
- the targetReader
charset
- the charset encodingbufferSize
- the size of the input buffer in number of characters
-
ReaderInputStream
Construct a newReaderInputStream
with a default input buffer size of 1024 characters.- Parameters:
reader
- the targetReader
charset
- the charset encoding
-
ReaderInputStream
Construct a newReaderInputStream
.- Parameters:
reader
- the targetReader
charsetName
- the name of the charset encodingbufferSize
- the size of the input buffer in number of characters
-
ReaderInputStream
Construct a newReaderInputStream
with a default input buffer size of 1024 characters.- Parameters:
reader
- the targetReader
charsetName
- the name of the charset encoding
-
ReaderInputStream
Construct a newReaderInputStream
that uses the default character encoding with a default input buffer size of 1024 characters.- Parameters:
reader
- the targetReader
-
-
Method Details
-
read
Read the specified number of bytes into an array.- Overrides:
read
in classInputStream
- Parameters:
b
- 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
-1
if the end of the stream has been reached - Throws:
IOException
- if an I/O error occurs
-
read
Read the specified number of bytes into an array.- Overrides:
read
in classInputStream
- Parameters:
b
- the byte array to read into- Returns:
- the number of bytes read or
-1
if the end of the stream has been reached - Throws:
IOException
- if an I/O error occurs
-
read
Read a single byte.- Specified by:
read
in classInputStream
- Returns:
- either the byte read or
-1
if the end of the stream has been reached - Throws:
IOException
- if an I/O error occurs
-
close
Close the stream. This method will cause the underlyingReader
to be closed.- Specified by:
close
in interfaceAutoCloseable
- Specified by:
close
in interfaceCloseable
- Overrides:
close
in classInputStream
- Throws:
IOException
- if an I/O error occurs
-