Top Description Fields Constructors Methods
com.google.common.io

pack-priv final Class ReaderInputStream

extends InputStream
Class Inheritance
Annotations
@J2ktIncompatible
@GwtIncompatible
@ElementTypesAreNonnullByDefault
Static Imports
com.google.common.base.Preconditions.checkArgument, .Preconditions.checkNotNull, .Preconditions.checkPositionIndexes

An InputStream that converts characters from a Reader into bytes using an arbitrary Charset.

This is an alternative to copying the data to an OutputStream via a Writer, which is necessarily blocking. By implementing an InputStream it allows consumers to "pull" as much data as they can handle, which is more convenient when dealing with flow controlled, async APIs.

Author
Chris Nokleberg

Field Summary

Modifier and TypeField and Description
private ByteBuffer
byteBuffer

byteBuffer holds encoded characters that have not yet been sent to the caller of the input stream.

private CharBuffer
charBuffer

charBuffer holds characters that have been read from the Reader but not encoded yet.

private boolean
doneFlushing

Whether we've successfully flushed the encoder.

private boolean
draining

Whether we're copying encoded bytes to the caller's buffer.

private final CharsetEncoder
private boolean
endOfInput

Whether we've finished reading the reader.

private final Reader
private final byte[]

Constructor Summary

AccessConstructor and Description
pack-priv
ReaderInputStream(Reader
input source
reader
,
Charset
character set used for encoding chars to bytes
charset
,
int
size of internal input and output buffers
bufferSize
)

Creates a new input stream that will encode the characters from reader into bytes using the given character set.

pack-priv
ReaderInputStream(Reader
input source
reader
,
CharsetEncoder
character set encoder used for encoding chars to bytes
encoder
,
int
size of internal input and output buffers
bufferSize
)

Creates a new input stream that will encode the characters from reader into bytes using the given character set encoder.

Method Summary

Modifier and TypeMethod and Description
private static int
availableCapacity(Buffer buffer)

Returns the number of elements between the limit and capacity.

public void
close()

Overrides java.io.InputStream.close.

Implements java.io.Closeable.close.

Closes this input stream and releases any system resources associated with the stream.
private int
drain(byte[] b, int off, int len)

Copy as much of the byte buffer into the output array as possible, returning the (positive) number of characters copied.

private static CharBuffer
grow(CharBuffer buf)

Returns a new CharBuffer identical to buf, except twice the capacity.

public int
read()

Implements abstract java.io.InputStream.read.

Reads the next byte of data from the input stream.
public int
read(byte[]
the buffer into which the data is read.
b
,
int
the start offset in array b at which the data is written.
off
,
int
the maximum number of bytes to read.
len
)

Overrides java.io.InputStream.read.

Reads up to len bytes of data from the input stream into an array of bytes.
private void
readMoreChars()

Handle the case of underflow caused by needing more input characters.

private void
startDraining(boolean overflow)

Flips the buffer output buffer so we can start reading bytes from it.

Inherited from java.io.InputStream:
availablemarkmarkSupportednullInputStreamreadreadAllBytesreadNBytesreadNBytesresetskipskipNBytestransferTo

Field Detail

byteBufferback to summary
private ByteBuffer byteBuffer

byteBuffer holds encoded characters that have not yet been sent to the caller of the input stream. When encoding it is "unflipped" (encoded bytes between 0 and position) and when draining it is flipped (undrained bytes between position and limit).

charBufferback to summary
private CharBuffer charBuffer

charBuffer holds characters that have been read from the Reader but not encoded yet. The buffer is perpetually "flipped" (unencoded characters between position and limit).

doneFlushingback to summary
private boolean doneFlushing

Whether we've successfully flushed the encoder.

drainingback to summary
private boolean draining

Whether we're copying encoded bytes to the caller's buffer.

encoderback to summary
private final CharsetEncoder encoder
endOfInputback to summary
private boolean endOfInput

Whether we've finished reading the reader.

readerback to summary
private final Reader reader
singleByteback to summary
private final byte[] singleByte

Constructor Detail

ReaderInputStreamback to summary
pack-priv ReaderInputStream(Reader reader, Charset charset, int bufferSize)

Creates a new input stream that will encode the characters from reader into bytes using the given character set. Malformed input and unmappable characters will be replaced.

Parameters
reader:Reader

input source

charset:Charset

character set used for encoding chars to bytes

bufferSize:int

size of internal input and output buffers

Exceptions
IllegalArgumentException:
if bufferSize is non-positive
ReaderInputStreamback to summary
pack-priv ReaderInputStream(Reader reader, CharsetEncoder encoder, int bufferSize)

Creates a new input stream that will encode the characters from reader into bytes using the given character set encoder.

Parameters
reader:Reader

input source

encoder:CharsetEncoder

character set encoder used for encoding chars to bytes

bufferSize:int

size of internal input and output buffers

Exceptions
IllegalArgumentException:
if bufferSize is non-positive

Method Detail

availableCapacityback to summary
private static int availableCapacity(Buffer buffer)

Returns the number of elements between the limit and capacity.

closeback to summary
public void close() throws IOException

Overrides java.io.InputStream.close.

Implements java.io.Closeable.close.

Doc from java.io.InputStream.close.

Closes this input stream and releases any system resources associated with the stream.

Annotations
@Override
Exceptions
IOException:
if an I/O error occurs.
drainback to summary
private int drain(byte[] b, int off, int len)

Copy as much of the byte buffer into the output array as possible, returning the (positive) number of characters copied.

growback to summary
private static CharBuffer grow(CharBuffer buf)

Returns a new CharBuffer identical to buf, except twice the capacity.

readback to summary
public int read() throws IOException

Implements abstract java.io.InputStream.read.

Doc from java.io.InputStream.read.

Reads the next byte of data from the input stream. The value byte is returned as an int in the range 0 to 255. If no byte is available because the end of the stream has been reached, the value -1 is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.

Returns:int

the next byte of data, or -1 if the end of the stream is reached.

Annotations
@Override
Exceptions
IOException:
if an I/O error occurs.
readback to summary
public int read(byte[] b, int off, int len) throws IOException

Overrides java.io.InputStream.read.

Doc from java.io.InputStream.read.

Reads up to len bytes of data from the input stream into an array of bytes. An attempt is made to read as many as len bytes, but a smaller number may be read. The number of bytes actually read is returned as an integer.

This method blocks until input data is available, end of file is detected, or an exception is thrown.

If len is zero, then no bytes are read and 0 is returned; otherwise, there is an attempt to read at least one byte. If no byte is available because the stream is at end of file, the value -1 is returned; otherwise, at least one byte is read and stored into b.

The first byte read is stored into element b[off], the next one into b[off+1], and so on. The number of bytes read is, at most, equal to len. Let k be the number of bytes actually read; these bytes will be stored in elements b[off] through b[off+k-1], leaving elements b[off+k] through b[off+len-1] unaffected.

In every case, elements b[0] through b[off-1] and elements b[off+len] through b[b.length-1] are unaffected.

Parameters
b:byte[]

the buffer into which the data is read.

off:int

the start offset in array b at which the data is written.

len:int

the maximum number of bytes to read.

Returns:int

the total number of bytes read into the buffer, or -1 if there is no more data because the end of the stream has been reached.

Annotations
@Override
Exceptions
IOException:
If the first byte cannot be read for any reason other than end of file, or if the input stream has been closed, or if some other I/O error occurs.
readMoreCharsback to summary
private void readMoreChars() throws IOException

Handle the case of underflow caused by needing more input characters.

startDrainingback to summary
private void startDraining(boolean overflow)

Flips the buffer output buffer so we can start reading bytes from it. If we are starting to drain because there was overflow, and there aren't actually any characters to drain, then the overflow must be due to a small output buffer.