schmitzm.io
Class CombinedInputStream

java.lang.Object
  extended by java.io.InputStream
      extended by schmitzm.io.CombinedInputStream
All Implemented Interfaces:
Closeable

public class CombinedInputStream
extends InputStream


Diese Klasse wurde urspruenglich 2002/2003 von Martin Schmitz fuer die ADAGIOS-Java-Library (Universitaet Bonn) erstellt, 2009 in das SCHMITZM-Projekt uebernommen und teilweise erweitert.
Diese Klasse stellt einen Eingabe-Stream dar, der Daten auf Basis mehrerer anderen InputStream-Instanzen liefert. Zunaechst werden Bytes aus dem ersten Stream geliefert, wenn dieser Stream keine Daten mehr liefern kann aus dem zweiten, usw.
Sobald ein Stream einmal komplett geleert wurde, liefert die read()-Methode nur noch Bytes aus einem der naechsten Streams. Auch wenn der "leere" Stream spaeter wieder Daten liefern koennte, werden diese nicht mehr beruecksichtigt, sondern einfach ignoriert.
Diese Klasse kann z.B. verwendet werden, um bereits aus einem InputStream gelesene Daten (z.B. einen Header) diesem wieder voranzustellen, um den InputStream "als Original" weiterzugeben.
Beispiel:
Ein Klasse liest Text-Repraesentationenen unterschiedlicher Typen aus einer Datei. Erst nachdem der Header eines jeden Objekts eingelesen wurde, kann entschieden werden, welche Typ-Klasse instanziiert werden muss. Um deren initFromText(InputStream)-Methode aufrufen zu koennen, wird aber wieder der komplette InputStream inklusive Header benoetigt.
Hierzu kann ein CombinedInputStream, zusammengesetzt aus einem neuen ByteArrayInputStream fuer den bereits eingelesenen Header und dem Eingabe-Stream der Datei, erzeugt werden, welcher der initFromText(InputStream)-Methode uebergeben wird.

Version:
1.0
Author:
Martin Schmitz (University of Bonn/Germany)

Constructor Summary
CombinedInputStream(InputStream[] input)
          Erzeugt einen neuen CombinedInputStream.
CombinedInputStream(int size)
          Erzeugt einen neuen CombinedInputStream.
 
Method Summary
 int available()
          Liefert die gesamt Anzahl von Bytes, die in den Eingabe-Streams noch zur Verfuegung stehen.
 void close()
          Schliesst alle Eingabe-Streams.
 int getStreamCount()
          Liefert die Anzahl an Streams aus der der CombinedInputStream zusammengesetzt wurde.
 int read()
          Liefert ein (unsigned) Byte aus dem aktuellen Stream.
 void regenerateAvailableBytes()
          Errechnet die Anzahl der insgesamt zur Verfuegung stehenden Bytes neu.
 void setInputStream(int i, InputStream stream)
          Setzt einen Teil-Stream.
 
Methods inherited from class java.io.InputStream
mark, markSupported, read, read, reset, skip
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

CombinedInputStream

public CombinedInputStream(InputStream[] input)
                    throws IOException
Erzeugt einen neuen CombinedInputStream.

Parameters:
input - Eingabe-Streams aus denen sukzessive gelesen wird
Throws:
IOException - falls beim Ermitteln der insgesamt zur Verfuegung stehenden Bytes ein Fehler auftritt

CombinedInputStream

public CombinedInputStream(int size)
Erzeugt einen neuen CombinedInputStream.

Parameters:
size - Anzahl an Eingabe-Streams auf die der CombinedInputStream dimensioniert wird
Method Detail

getStreamCount

public int getStreamCount()
Liefert die Anzahl an Streams aus der der CombinedInputStream zusammengesetzt wurde.


setInputStream

public void setInputStream(int i,
                           InputStream stream)
                    throws IOException
Setzt einen Teil-Stream. Die Anzahl der insgesamt zur Verfuegung stehenden Bytes wird danach neu berechnet.

Throws:
IOException
See Also:
regenerateAvailableBytes()

regenerateAvailableBytes

public void regenerateAvailableBytes()
                              throws IOException
Errechnet die Anzahl der insgesamt zur Verfuegung stehenden Bytes neu. Dabei werden nur der aktuelle Stream und die darauf folgenden beruecksichtigt. Die bereits ausgelesenen Streams werden ignoriert, auch wenn in ihnen nun evt. wieder Bytes zur Verfuegung stehen.

Throws:
IOException

available

public int available()
Liefert die gesamt Anzahl von Bytes, die in den Eingabe-Streams noch zur Verfuegung stehen.
Bemerkung:
Aus Effizienzgruenden wird die Anzahl der Verfuegung stehenden Bytes nicht bei jedem Aufruf neu errechnet, sondern nur beim Setzen eines neuen Streams (mittels setInputStream(..)). Danach wird nach bei jedem read()-Aufruf ein Zaehler herabgesetzt.
Aendert sich die Byte-Zahl eines Teil-Streams waehrend der Benutzung des CombinedInputStream, sollte die Methode regenerateAvailableBytes() aufgerufen werden, um die Anzahl der zur Verfuegung stehenden Bytes neu zu berechnen!!

Overrides:
available in class InputStream
Throws:
IOException - falls der Zugriff auf einen der beiden Eingabe-Streams scheitert
See Also:
regenerateAvailableBytes()

read

public int read()
         throws IOException
Liefert ein (unsigned) Byte aus dem aktuellen Stream. Solange der erste Stream noch Daten liefern kann, werden seine Bytes zurueckgegeben. Danach die Bytes des zweiten Streams, usw.

Specified by:
read in class InputStream
Returns:
-1, falls keiner der Streams noch Daten liefern kann
Throws:
IOException - falls der Zugriff auf einen der Eingabe-Streams scheitert
See Also:
available()

close

public void close()
           throws IOException
Schliesst alle Eingabe-Streams.

Specified by:
close in interface Closeable
Overrides:
close in class InputStream
Throws:
IOException - falls der Zugriff auf einen der Eingabe-Streams scheitert