/**
* Project pack:tag >> http://packtag.sf.net
*
* This software is published under the terms of the LGPL
* License version 2.1, a copy of which has been included with this
* distribution in the 'lgpl.txt' file.
*
* Creation date: 15.04.2007 - 18:27:26
* Last author: $Author: danielgalan $
* Last modified: $Date: 2008/02/10 20:03:21 $
* Revision: $Revision: 1.4 $
*
* $Log: CombinedInputStream.java,v $
* Revision 1.4 2008/02/10 20:03:21 danielgalan
* Fix for IE - if after a closing bracket a var keyword is, IE can't interpret this, eg "varx={}var y ={}" mus be seperated: "varx={}\nvar y ={}"
*
* Revision 1.3 2007/05/02 21:38:38 danielgalan
* alias to name
*
* Revision 1.2 2007/05/02 21:29:18 danielgalan
* last fixes for 2.0, attribute media
*
* Revision 1.1 2007/04/22 19:04:24 danielgalan
* pack.tag moved from subversion to good old CVS
*/
import java.io.IOException;
import java.io.InputStream;
/**
* Reads multiple Inputstreams as one
*
* @author Daniel Galán y Martins
* @version $Revision: 1.4 $
*/
public class CombinedInputStream extends InputStream {
/** The current Stream to read from */
private int current;
boolean isNextLineFeed = false;
/** The Streams to combine */
private final InputStream[] streams;
/**
* Constructs an combined InputStream, that reads from array stream per stream, till the last stream
*
* @param streams All Streams that will be combined
*/
public CombinedInputStream(final InputStream[] streams) {
current = 0;
this.streams = streams;
}
/**
* Reads from the list of streams, when the last stream is over, -1 will be returned (as usual)
*/
public int read() throws IOException {
if (isNextLineFeed) {
isNextLineFeed = false;
return '\n';
}
int i = -1;
if (current < streams.length) {
i = streams[current].read();
if (i == -1) {
isNextLineFeed = true;
// the current stream has been finished, use the next one
current++;
return read();
}
}
return i;
}
/** Closes all streams */
public void close() throws IOException {
for (int i = 0; i < streams.length; i++) {
streams[i].close();
}
}
/** Is there more data to read */
public int available() throws IOException {
return current < streams.length ? streams[current].available() : 0;
}
}