Class ReaderInputStream
- java.lang.Object
-
- java.io.InputStream
-
- org.apache.commons.io.input.ReaderInputStream
-
- All Implemented Interfaces:
java.io.Closeable
,java.lang.AutoCloseable
public class ReaderInputStream extends java.io.InputStream
InputStream
implementation that reads a character stream from aReader
and transforms it to a byte stream using a specified charset encoding. The stream is transformed using aCharsetEncoder
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 theReaderInputStream
, all reads from theReader
are buffered. There is therefore no well defined correlation between the current position of theReader
and that of theReaderInputStream
. This also implies that in general there is no need to wrap the underlyingReader
in aBufferedReader
.ReaderInputStream
implements the inverse transformation ofInputStreamReader
; in the following example, reading fromin2
would return the same byte sequence as reading fromin
(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 asOutputStreamWriter
, except that the control flow is reversed: both classes transform a character stream into a byte stream, butOutputStreamWriter
pushes data to the underlying stream, whileReaderInputStream
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 aReader
instance. An example of a situation where this problem may appear is when implementing thejavax.activation.DataSource
interface from the Java Activation Framework.The
InputStream.available()
method of this class always returns 0. The methodsInputStream.mark(int)
andInputStream.reset()
are not supported.Instances of
ReaderInputStream
are not thread safe.- Since:
- 2.0
- See Also:
WriterOutputStream
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
ReaderInputStream.Builder
Builds a newReaderInputStream
instance.
-
Field Summary
Fields Modifier and Type Field Description private java.nio.charset.CharsetEncoder
charsetEncoder
private java.nio.CharBuffer
encoderIn
CharBuffer used as input for the decoder.private java.nio.ByteBuffer
encoderOut
ByteBuffer used as output for the decoder.private boolean
endOfInput
private java.nio.charset.CoderResult
lastCoderResult
private java.io.Reader
reader
-
Constructor Summary
Constructors Constructor Description ReaderInputStream(java.io.Reader reader)
Deprecated.Usebuilder()
insteadReaderInputStream(java.io.Reader reader, java.lang.String charsetName)
Deprecated.Usebuilder()
insteadReaderInputStream(java.io.Reader reader, java.lang.String charsetName, int bufferSize)
Deprecated.Usebuilder()
insteadReaderInputStream(java.io.Reader reader, java.nio.charset.Charset charset)
Deprecated.Usebuilder()
instead, will be protected for subclasses.ReaderInputStream(java.io.Reader reader, java.nio.charset.CharsetEncoder charsetEncoder)
Deprecated.Usebuilder()
insteadReaderInputStream(java.io.Reader reader, java.nio.charset.CharsetEncoder charsetEncoder, int bufferSize)
Deprecated.Usebuilder()
insteadReaderInputStream(java.io.Reader reader, java.nio.charset.Charset charset, int bufferSize)
Deprecated.Usebuilder()
instead
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description static ReaderInputStream.Builder
builder()
Constructs a newReaderInputStream.Builder
.(package private) static int
checkMinBufferSize(java.nio.charset.CharsetEncoder charsetEncoder, int bufferSize)
void
close()
Closes the stream.private void
fillBuffer()
Fills the internal char buffer from the reader.(package private) java.nio.charset.CharsetEncoder
getCharsetEncoder()
Gets the CharsetEncoder.(package private) static float
minBufferSize(java.nio.charset.CharsetEncoder charsetEncoder)
private static java.nio.charset.CharsetEncoder
newEncoder(java.nio.charset.Charset charset)
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.
-
-
-
Field Detail
-
reader
private final java.io.Reader reader
-
charsetEncoder
private final java.nio.charset.CharsetEncoder charsetEncoder
-
encoderIn
private final java.nio.CharBuffer 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
private final java.nio.ByteBuffer 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
private java.nio.charset.CoderResult lastCoderResult
-
endOfInput
private boolean endOfInput
-
-
Constructor Detail
-
ReaderInputStream
@Deprecated public ReaderInputStream(java.io.Reader reader)
Deprecated.Usebuilder()
insteadConstructs a newReaderInputStream
that uses the default character encoding with a default input buffer size of 8192 characters.- Parameters:
reader
- the targetReader
-
ReaderInputStream
@Deprecated public ReaderInputStream(java.io.Reader reader, java.nio.charset.Charset charset)
Deprecated.Usebuilder()
instead, will be protected for subclasses.Constructs a newReaderInputStream
with a default input buffer size of 8192 characters.The encoder created for the specified charset will use
CodingErrorAction.REPLACE
for malformed input and unmappable characters.- Parameters:
reader
- the targetReader
charset
- the charset encoding
-
ReaderInputStream
@Deprecated public ReaderInputStream(java.io.Reader reader, java.nio.charset.Charset charset, int bufferSize)
Deprecated.Usebuilder()
insteadConstructs a newReaderInputStream
.The encoder created for the specified charset will use
CodingErrorAction.REPLACE
for 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 public ReaderInputStream(java.io.Reader reader, java.nio.charset.CharsetEncoder charsetEncoder)
Deprecated.Usebuilder()
insteadConstructs a newReaderInputStream
.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.- Parameters:
reader
- the targetReader
charsetEncoder
- the charset encoder- Since:
- 2.1
-
ReaderInputStream
@Deprecated public ReaderInputStream(java.io.Reader reader, java.nio.charset.CharsetEncoder charsetEncoder, int bufferSize)
Deprecated.Usebuilder()
insteadConstructs a newReaderInputStream
.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.- Parameters:
reader
- the targetReader
charsetEncoder
- 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 public ReaderInputStream(java.io.Reader reader, java.lang.String charsetName)
Deprecated.Usebuilder()
insteadConstructs a newReaderInputStream
with a default input buffer size of 8192 characters.The encoder created for the specified charset will use
CodingErrorAction.REPLACE
for malformed input and unmappable characters.- Parameters:
reader
- the targetReader
charsetName
- the name of the charset encoding
-
ReaderInputStream
@Deprecated public ReaderInputStream(java.io.Reader reader, java.lang.String charsetName, int bufferSize)
Deprecated.Usebuilder()
insteadConstructs a newReaderInputStream
.The encoder created for the specified charset will use
CodingErrorAction.REPLACE
for malformed input and unmappable characters.- Parameters:
reader
- the targetReader
charsetName
- the name of the charset encoding, null maps to the default Charset.bufferSize
- the size of the input buffer in number of characters
-
-
Method Detail
-
newEncoder
private static java.nio.charset.CharsetEncoder newEncoder(java.nio.charset.Charset charset)
-
builder
public static ReaderInputStream.Builder builder()
Constructs a newReaderInputStream.Builder
.- Returns:
- a new
ReaderInputStream.Builder
. - Since:
- 2.12.0
-
checkMinBufferSize
static int checkMinBufferSize(java.nio.charset.CharsetEncoder charsetEncoder, int bufferSize)
-
minBufferSize
static float minBufferSize(java.nio.charset.CharsetEncoder charsetEncoder)
-
close
public void close() throws java.io.IOException
Closes the stream. This method will cause the underlyingReader
to be closed.- Specified by:
close
in interfacejava.lang.AutoCloseable
- Specified by:
close
in interfacejava.io.Closeable
- Overrides:
close
in classjava.io.InputStream
- Throws:
java.io.IOException
- if an I/O error occurs.
-
fillBuffer
private void fillBuffer() throws java.io.IOException
Fills the internal char buffer from the reader.- Throws:
java.io.IOException
- If an I/O error occurs
-
getCharsetEncoder
java.nio.charset.CharsetEncoder getCharsetEncoder()
Gets the CharsetEncoder.- Returns:
- the CharsetEncoder.
-
read
public int read() throws java.io.IOException
Reads a single byte.- Specified by:
read
in classjava.io.InputStream
- Returns:
- either the byte read or
-1
if the end of the stream has been reached - Throws:
java.io.IOException
- if an I/O error occurs.
-
read
public int read(byte[] b) throws java.io.IOException
Reads the specified number of bytes into an array.- Overrides:
read
in classjava.io.InputStream
- 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:
java.io.IOException
- if an I/O error occurs.
-
read
public int read(byte[] array, int off, int len) throws java.io.IOException
Reads the specified number of bytes into an array.- Overrides:
read
in classjava.io.InputStream
- 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
-1
if the end of the stream has been reached - Throws:
java.io.IOException
- if an I/O error occurs.
-
-