public class ReaderInputStream
extends java.io.InputStream
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, see 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, i.e. 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 InputStream.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.
WriterOutputStream
Modifier and Type | Class and Description |
---|---|
static class |
ReaderInputStream.Builder
Builds a new
ReaderInputStream instance. |
Constructor and Description |
---|
ReaderInputStream(java.io.Reader reader)
Deprecated.
Use
builder() instead |
ReaderInputStream(java.io.Reader reader,
java.nio.charset.Charset charset)
Deprecated.
Use
builder() instead, will be protected for subclasses. |
ReaderInputStream(java.io.Reader reader,
java.nio.charset.CharsetEncoder charsetEncoder)
Deprecated.
Use
builder() instead |
ReaderInputStream(java.io.Reader reader,
java.nio.charset.CharsetEncoder charsetEncoder,
int bufferSize)
Deprecated.
Use
builder() instead |
ReaderInputStream(java.io.Reader reader,
java.nio.charset.Charset charset,
int bufferSize)
Deprecated.
Use
builder() instead |
ReaderInputStream(java.io.Reader reader,
java.lang.String charsetName)
Deprecated.
Use
builder() instead |
ReaderInputStream(java.io.Reader reader,
java.lang.String charsetName,
int bufferSize)
Deprecated.
Use
builder() instead |
Modifier and Type | Method and Description |
---|---|
static ReaderInputStream.Builder |
builder()
Constructs a new
ReaderInputStream.Builder . |
void |
close()
Closes the stream.
|
int |
read()
Reads a single byte.
|
int |
read(byte[] b)
Reads the specified number of bytes into an array.
|
int |
read(byte[] array,
int off,
int len)
Reads the specified number of bytes into an array.
|
@Deprecated public ReaderInputStream(java.io.Reader reader)
builder()
insteadReaderInputStream
that uses the default character encoding with a default input buffer size of
characters.reader
- the target Reader
@Deprecated public ReaderInputStream(java.io.Reader reader, java.nio.charset.Charset charset)
builder()
instead, will be protected for subclasses.ReaderInputStream
with a default input buffer size of characters.
The encoder created for the specified charset will use CodingErrorAction.REPLACE
for malformed input and unmappable characters.
reader
- the target Reader
charset
- the charset encoding@Deprecated public ReaderInputStream(java.io.Reader reader, java.nio.charset.Charset charset, int bufferSize)
builder()
insteadReaderInputStream
.
The encoder created for the specified charset will use CodingErrorAction.REPLACE
for malformed input and unmappable characters.
reader
- the target Reader
.charset
- the charset encoding.bufferSize
- the size of the input buffer in number of characters.@Deprecated public ReaderInputStream(java.io.Reader reader, java.nio.charset.CharsetEncoder charsetEncoder)
builder()
insteadReaderInputStream
.
This constructor does not call reset
on the provided encoder. The caller of this constructor should do this when providing
an encoder which had already been in use.
reader
- the target Reader
charsetEncoder
- the charset encoder@Deprecated public ReaderInputStream(java.io.Reader reader, java.nio.charset.CharsetEncoder charsetEncoder, int bufferSize)
builder()
insteadReaderInputStream
.
This constructor does not call reset
on the provided encoder. The caller of this constructor should do this when providing
an encoder which had already been in use.
reader
- the target Reader
charsetEncoder
- the charset encoder, null defaults to the default Charset encoder.bufferSize
- the size of the input buffer in number of characters@Deprecated public ReaderInputStream(java.io.Reader reader, java.lang.String charsetName)
builder()
insteadReaderInputStream
with a default input buffer size of characters.
The encoder created for the specified charset will use CodingErrorAction.REPLACE
for malformed input and unmappable characters.
reader
- the target Reader
charsetName
- the name of the charset encoding@Deprecated public ReaderInputStream(java.io.Reader reader, java.lang.String charsetName, int bufferSize)
builder()
insteadReaderInputStream
.
The encoder created for the specified charset will use CodingErrorAction.REPLACE
for malformed input and unmappable characters.
reader
- the target Reader
charsetName
- the name of the charset encoding, null maps to the default Charset.bufferSize
- the size of the input buffer in number of characterspublic static ReaderInputStream.Builder builder()
ReaderInputStream.Builder
.ReaderInputStream.Builder
.public void close() throws java.io.IOException
Reader
to be closed.close
in interface java.io.Closeable
close
in interface java.lang.AutoCloseable
close
in class java.io.InputStream
java.io.IOException
- if an I/O error occurs.public int read() throws java.io.IOException
read
in class java.io.InputStream
-1
if the end of the stream has been reachedjava.io.IOException
- if an I/O error occurs.public int read(byte[] b) throws java.io.IOException
read
in class java.io.InputStream
b
- the byte array to read into-1
if the end of the stream has been reachedjava.io.IOException
- if an I/O error occurs.public int read(byte[] array, int off, int len) throws java.io.IOException
read
in class java.io.InputStream
array
- the byte array to read intooff
- the offset to start reading bytes intolen
- the number of bytes to read-1
if the end of the stream has been reachedjava.io.IOException
- if an I/O error occurs.Copyright © 2010 - 2023 Adobe. All Rights Reserved