T
- Optional result returned by the function
produce(OutputStream) after the data has been
written. It can be obtained calling the getResult()public abstract class InputStreamFromOutputStream<T> extends PipedInputStream
This class allow to read the data written to an OutputStream from an InputStream.
To use this class you must subclass it and implement the abstract method
produce(OutputStream). The data who is produced inside this
function can be written to the sink OutputStream
passed as a
parameter. Later it can be read back from from the
InputStreamFromOutputStream
class (whose ancestor is
java.io.InputStream
).
final String dataId=//id of some data. final InputStreamFromOutputStream<String> isos = new InputStreamFromOutputStream<String>() { @Override public String produce(final OutputStream dataSink) throws Exception { //call your application function who produces the data here //WARNING: we're in another thread here, so this method shouldn't //write any class field or make assumptions on the state of the class. return produceMydata(dataId,dataSink) } }; try { //now you can read from the InputStream the data that was written to the //dataSink OutputStream byte[] read=IOUtils.toByteArray(isos); //Use data here } catch (final IOException e) { //Handle exception here } finally { isos.close(); } //You can get the result of produceMyData after the stream has been closed. String resultOfProduction = isos.getResult();
This class encapsulates a pipe and a Thread
, hiding the
complexity of using them. It is possible to select different strategies for
allocating the internal thread or even specify the
ExecutorService for thread execution.
ExecutionModel
buffer, in, out, PIPE_SIZE
Constructor and Description |
---|
InputStreamFromOutputStream()
It creates a
InputStreamFromOutputStream with a
THREAD_PER_INSTANCE thread strategy. |
InputStreamFromOutputStream(boolean startImmediately,
boolean joinOnClose,
ExecutorService executor,
int pipeBufferSize) |
InputStreamFromOutputStream(boolean joinOnClose,
ExecutionModel executionModel)
It creates a
InputStreamFromOutputStream and let the user
choose the thread allocation strategy he likes. |
InputStreamFromOutputStream(boolean joinOnClose,
ExecutorService executor)
It creates a
InputStreamFromOutputStream and let the user
specify the ExecutorService that will execute the
produce(OutputStream) method. |
InputStreamFromOutputStream(boolean joinOnClose,
ExecutorService executor,
int pipeBufferSize)
It creates a
InputStreamFromOutputStream and let the user
specify the ExecutorService that will execute the
produce(OutputStream) method and the pipe buffer size. |
InputStreamFromOutputStream(ExecutionModel executionModel)
It creates a
InputStreamFromOutputStream and let the user
choose the thread allocation strategy he likes. |
InputStreamFromOutputStream(ExecutorService executor)
It creates a
InputStreamFromOutputStream and let the user
specify the ExecutorService that will execute the
produce(OutputStream) method. |
Modifier and Type | Method and Description |
---|---|
protected void |
afterClose()
This method is called just before the
close() method completes,
and after the eventual join with the internal thread. |
void |
close() |
static String[] |
getActiveThreadNames()
This method can be used for debugging purposes to get a list of the
currently active threads.
|
T |
getResult()
Returns the object that was previously returned by the
produce(OutputStream) method.
|
protected abstract T |
produce(OutputStream sink)
This method must be implemented by the user of this class to produce the
data that must be read from the external
InputStream . |
int |
read() |
int |
read(byte[] b) |
int |
read(byte[] b,
int off,
int len) |
static void |
setDefaultPipeSize(int defaultPipeSize)
Set the size for the pipe buffer for the newly created
InputStreamFromOutputStream . |
available, connect, receive
mark, markSupported, reset, skip
public InputStreamFromOutputStream()
It creates a InputStreamFromOutputStream
with a
THREAD_PER_INSTANCE thread strategy.
ExecutionModel.THREAD_PER_INSTANCE
public InputStreamFromOutputStream(boolean startImmediately, boolean joinOnClose, ExecutorService executor, int pipeBufferSize)
public InputStreamFromOutputStream(boolean joinOnClose, ExecutionModel executionModel)
It creates a InputStreamFromOutputStream
and let the user
choose the thread allocation strategy he likes.
This class executes the produce method in a thread created internally.
executionModel
- Defines how the internal thread is allocated.joinOnClose
- If true
the close() method will
also wait for the internal thread to finish.ExecutionModel
public InputStreamFromOutputStream(boolean joinOnClose, ExecutorService executor)
It creates a InputStreamFromOutputStream
and let the user
specify the ExecutorService that will execute the
produce(OutputStream) method.
executor
- Defines the ExecutorService that will allocate the the
internal thread.joinOnClose
- If true
the close() method will
also wait for the internal thread to finish.ExecutorService
public InputStreamFromOutputStream(boolean joinOnClose, ExecutorService executor, int pipeBufferSize)
It creates a InputStreamFromOutputStream
and let the user
specify the ExecutorService
that will execute the
produce(OutputStream) method and the pipe buffer size.
Using this method the default size is ignored.
executor
- Defines the ExecutorService that will allocate the the
internal thread.joinOnClose
- If true
the close() method will
also wait for the internal thread to finish.pipeBufferSize
- The size of the pipe buffer to allocate.ExecutorService
public InputStreamFromOutputStream(ExecutionModel executionModel)
It creates a InputStreamFromOutputStream
and let the user
choose the thread allocation strategy he likes.
This class executes the produce method in a thread created internally.
executionModel
- Defines how the internal thread is allocated.ExecutionModel
public InputStreamFromOutputStream(ExecutorService executor)
It creates a InputStreamFromOutputStream
and let the user
specify the ExecutorService that will execute the
produce(OutputStream) method.
executor
- Defines the ExecutorService that will allocate the the
internal thread.ExecutorService
public static final String[] getActiveThreadNames()
public static void setDefaultPipeSize(int defaultPipeSize)
InputStreamFromOutputStream
. Default is 4096 bytes.defaultPipeSize
- the default pipe buffer size in bytes.protected void afterClose() throws IOException
This method is called just before the close()
method completes,
and after the eventual join with the internal thread.
It is an extension point designed for applications that need to perform
some operation when the InputStream
is closed.
IOException
- threw when the subclass wants to communicate an exception
during close.public void close() throws IOException
close
in interface Closeable
close
in interface AutoCloseable
close
in class PipedInputStream
IOException
public T getResult() throws Exception
Returns the object that was previously returned by the produce(OutputStream) method. It performs all the synchronization operations needed to read the result and waits for the internal thread to terminate.
This method automatically invokes the close() method on the, stream.
Exception
- If the produce(OutputStream) method threw an
java.lang.Exception this method will throw again the same
exception.protected abstract T produce(OutputStream sink) throws Exception
This method must be implemented by the user of this class to produce the
data that must be read from the external InputStream
.
Special care must be paid passing arguments to this method or setting global fields because it is executed in another thread.
The right way to set a field variable is to return a value in the
produce
and retrieve it in the getResult().
sink
- the implementing class should write its data to this stream.Exception
- the exception eventually thrown by the implementing class is
returned by the read() methods.getResult()
public int read() throws IOException
read
in class PipedInputStream
IOException
public int read(byte[] b, int off, int len) throws IOException
read
in class PipedInputStream
IOException
public int read(byte[] b) throws IOException
read
in class InputStream
IOException
Copyright © 2008–2016. All rights reserved.