001    /*
002     * $Id: CatReader.java 3442 2010-12-25 16:28:07Z kredel $
003     */
004    
005    package edu.jas.util;
006    
007    
008    import java.io.Reader;
009    import java.io.IOException;
010    
011    //import org.apache.log4j.Logger;
012    
013    
014    
015    /**
016     * Reader to concat two readers.
017     * Read from first reader until it is empty, then read from second reader.
018     * @author Heinz Kredel
019     */
020    
021    public class CatReader extends Reader {
022    
023    
024        // private static final Logger logger = Logger.getLogger(CatReader.class);
025        // private static boolean debug = logger.isDebugEnabled();
026    
027    
028        private final Reader first;
029    
030    
031        private final Reader second;
032    
033    
034        private boolean doFirst;
035    
036    
037        /** 
038         * Constructor.
039         * @param f first Reader.
040         * @param s second Reader.
041         */
042        public CatReader(Reader f, Reader s) {
043            first = f;
044            second = s;
045            doFirst = true;
046        }
047    
048    
049        /** 
050         * Read char array.
051         * @param cbuf array.
052         * @param off start offset.
053         * @param len number of chars to read.
054         * @return number of chars read, or -1.
055         */
056        public int read(char[] cbuf, int off, int len) throws IOException {
057            int i = -1;
058            if ( doFirst ) {
059                i = first.read(cbuf,off,len);
060                if ( i < 0 ) {
061                    doFirst = false;
062                    i = second.read(cbuf,off,len);
063                }
064            } else {
065                i = second.read(cbuf,off,len);
066            }
067            //System.out.println("i = " + i);
068            return i;
069        }
070    
071    
072        /** 
073         * Close this Reader.
074         */
075        public void close() throws IOException {
076            try {
077                first.close();
078            } finally {
079                second.close();
080            }
081        }
082    
083    }