T - Optional result returned by the function
produce(Writer) after the data has been written. It
can be obtained calling the getResult()public abstract class ReaderFromWriter<T> extends Reader
This class allow to read the data written to an Writer from an Reader.
To use this class you must subclass it and implement the abstract method
produce(Writer). The data who is produced inside this function
can be written to the sink Writer passed as a parameter. Later
it can be read back from from the ReaderFromWriter class (whose
ancestor is java.io.Reader ).
final String dataId=//id of some data.
final ReaderFromWriter<String> rfw
= new ReaderFromWriter<String>() {
@Override
public String produce(final Writer 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 Reader the data that was written to the
//dataSink Writer
char[] read=IOUtils.toCharArray(rfw);
//Use data here
} catch (final IOException e) {
//Handle exception here
} finally {
rfw.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| Modifier and Type | Field and Description |
|---|---|
protected ExecutorService |
executorService |
| Constructor and Description |
|---|
ReaderFromWriter()
It creates a
ReaderFromWriter with a THREAD_PER_INSTANCE
thread strategy. |
ReaderFromWriter(boolean joinOnClose,
ExecutionModel executionModel)
It creates a
ReaderFromWriter and let the user choose the
thread allocation strategy he likes. |
ReaderFromWriter(boolean joinOnClose,
ExecutorService executor)
It creates a
ReaderFromWriter and let the user specify the
ExecutorService that will execute the produce(Writer)
method. |
ReaderFromWriter(boolean joinOnClose,
ExecutorService executor,
int pipeBufferSize)
It creates a
ReaderFromWriter and let the user specify the
ExecutorService that will execute the
produce(Writer) method and the pipe buffer size. |
ReaderFromWriter(ExecutionModel executionModel)
It creates a
ReaderFromWriter and let the user choose the
thread allocation strategy he likes. |
ReaderFromWriter(ExecutorService executor)
It creates a
ReaderFromWriter and let the user specify the
ExecutorService that will execute the produce(Writer)
method. |
| Modifier and Type | Method and Description |
|---|---|
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(Writer) method.
|
protected abstract T |
produce(Writer sink)
This method must be implemented by the user of this class to produce the
data that must be read from the external
Reader. |
int |
read() |
int |
read(char[] b,
int off,
int len) |
static void |
setDefaultPipeSize(int defaultPipeSize)
Set the size for the pipe circular buffer for the newly created
ReaderFromWriter. |
long |
skip(long n) |
protected final ExecutorService executorService
public ReaderFromWriter()
It creates a ReaderFromWriter with a THREAD_PER_INSTANCE
thread strategy.
ExecutionModel.THREAD_PER_INSTANCEpublic ReaderFromWriter(boolean joinOnClose,
ExecutionModel executionModel)
It creates a ReaderFromWriter 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.ExecutionModelpublic ReaderFromWriter(boolean joinOnClose,
ExecutorService executor)
It creates a ReaderFromWriter and let the user specify the
ExecutorService that will execute the produce(Writer)
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.ExecutorServicepublic ReaderFromWriter(boolean joinOnClose,
ExecutorService executor,
int pipeBufferSize)
It creates a ReaderFromWriter and let the user specify the
ExecutorService that will execute the
produce(Writer) 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.ExecutorServicepublic ReaderFromWriter(ExecutionModel executionModel)
It creates a ReaderFromWriter 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.ExecutionModelpublic ReaderFromWriter(ExecutorService executor)
It creates a ReaderFromWriter and let the user specify the
ExecutorService that will execute the produce(Writer)
method.
executor - Defines the ExecutorService that will allocate the the
internal thread.ExecutorServicepublic static final String[] getActiveThreadNames()
public static void setDefaultPipeSize(int defaultPipeSize)
ReaderFromWriter. Default is 4096 bytes.defaultPipeSize - the default pipe buffer size in bytes.public final void close()
throws IOException
close in interface Closeableclose in interface AutoCloseableclose in class ReaderIOExceptionpublic T getResult() throws Exception
Returns the object that was previously returned by the produce(Writer) method. It performs all the synchronization operations needed to read the result and waits for the internal thread to terminate.
This method must be called after the method close(), otherwise an IllegalStateException is thrown.
Exception - If the produce(Writer) method threw an
java.lang.Exception this method will throw again the same
exception.IllegalStateException - If the close() method hasn't been called yet.protected abstract T produce(Writer 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 Reader.
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
produceand 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 final int read()
throws IOException
read in class ReaderIOExceptionpublic final int read(char[] b,
int off,
int len)
throws IOException
read in class ReaderIOExceptionpublic long skip(long n)
throws IOException
skip in class ReaderIOExceptionCopyright © 2008–2016. All rights reserved.