CombinedInputStream.java Source code

Java tutorial

Introduction

Here is the source code for CombinedInputStream.java

Source

/**
 * 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 Galn 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;
    }
}