com.gc.iotools.stream.is
Class InputStreamFromOutputStream<T>

java.lang.Object
  extended by java.io.InputStream
      extended by com.gc.iotools.stream.is.InputStreamFromOutputStream<T>
Type Parameters:
T - Optional result returned by the function #produce(OutputStream)) after the data has been written. It can be obtained calling the getResult()
All Implemented Interfaces:
Closeable

public abstract class InputStreamFromOutputStream<T>
extends InputStream

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 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[] readed=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.

Since:
1.0
Author:
dvd.smnt
See Also:
ExecutionModel

Constructor Summary
InputStreamFromOutputStream()
           It creates a InputStreamFromOutputStream with a THREAD_PER_INSTANCE thread strategy.
InputStreamFromOutputStream(ExecutionModel executionModel)
           It creates a InputStreamFromOutputStream and let the user set the ExecutionModel he likes.
InputStreamFromOutputStream(ExecutorService executor)
           
 
Method Summary
 void close()
          
static String[] getActiveThreadNames()
           
 T getResult()
           Returns the object that was
protected abstract  T produce(OutputStream dataSink)
           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 off, int len)
          
static void setDefaultBufferSize(int defaultPipeSize)
          Set the size for the pipe circular buffer for the newly created InputStreamFromOutputStream.
 
Methods inherited from class java.io.InputStream
available, mark, markSupported, read, reset, skip
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

InputStreamFromOutputStream

public InputStreamFromOutputStream()

It creates a InputStreamFromOutputStream with a THREAD_PER_INSTANCE thread strategy.

See Also:
ExecutionModel.THREAD_PER_INSTANCE

InputStreamFromOutputStream

public InputStreamFromOutputStream(ExecutionModel executionModel)

It creates a InputStreamFromOutputStream and let the user set the ExecutionModel he likes.

Parameters:
executionModel - The preferred ExecutionModel.
See Also:
ExecutionModel

InputStreamFromOutputStream

public InputStreamFromOutputStream(ExecutorService executor)
Method Detail

getActiveThreadNames

public static final String[] getActiveThreadNames()

setDefaultBufferSize

public static void setDefaultBufferSize(int defaultPipeSize)
Set the size for the pipe circular buffer for the newly created InputStreamFromOutputStream. Default is 1024 bytes.

Parameters:
defaultPipeSize - the default pipe buffer size in bytes.
Since:
1.2.0

close

public final void close()
                 throws IOException

Specified by:
close in interface Closeable
Overrides:
close in class InputStream
Throws:
IOException

getResult

public T getResult()
            throws Exception

Returns the object that was

This method must be called after the method close(), otherwise an IllegalStateException is thrown. It waits for the method produce(OutputStream) to terminate and returns the result produced here.

Returns:
Object that was returned by the produce(OutputStream) method.
Throws:
Exception - If the produce(OutputStream) method threw an Exception this method will throw again the same exception.
Since:
1.2.0

read

public final int read()
               throws IOException

Specified by:
read in class InputStream
Throws:
IOException

read

public final int read(byte[] b,
                      int off,
                      int len)
               throws IOException

Overrides:
read in class InputStream
Throws:
IOException

produce

protected abstract T produce(OutputStream dataSink)
                      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 produceand retrieve it in the getResult().

Parameters:
dataSink - the implementing class should write data to this stream.
Returns:
The implementing class can use this to return a result of data production. The result will be available through the method getResult().
Throws:
Exception - the exception eventually thrown by the implementing class is returned by the read() methods.
See Also:
getResult()


Copyright © 2008-2009. All Rights Reserved.