1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.apache.commons.flatfile.util; 18 19 import java.io.IOException; 20 import java.io.InputStream; 21 import java.util.Arrays; 22 import java.util.Iterator; 23 24 import org.apache.commons.lang3.Validate; 25 26 /** 27 * Unified InputStream representation of multiple concatenated InputStreams. 28 * @version $Revision: 1301242 $ $Date: 2012-03-15 17:14:40 -0500 (Thu, 15 Mar 2012) $ 29 */ 30 public class ConcatenatedInputStream extends InputStream { 31 /** EOF */ 32 public static final int EOF = -1; 33 34 private static final InputStream AT_EOF = new InputStream() { 35 public int read() throws IOException { 36 return EOF; 37 } 38 }; 39 40 private final Iterator<InputStream> iter; 41 private InputStream current; 42 43 /** 44 * Create a new ConcatenatedInputStream. 45 * @param src InputStreams 46 */ 47 public ConcatenatedInputStream(Iterable<InputStream> src) { 48 this.iter = Validate.notNull(src).iterator(); 49 next(); 50 } 51 52 /** 53 * Create a new ConcatenatedInputStream. 54 * @param src InputStreams 55 */ 56 public ConcatenatedInputStream(InputStream... src) { 57 this(Arrays.asList(Validate.notNull(src))); 58 } 59 60 /** 61 * {@inheritDoc} 62 */ 63 public int read() throws IOException { 64 int n = current.read(); 65 while (n == EOF && current != AT_EOF) { 66 next(); 67 n = current.read(); 68 } 69 return n; 70 } 71 72 /** 73 * Position to the next InputStream 74 */ 75 private void next() { 76 current = iter.hasNext() ? iter.next() : AT_EOF; 77 } 78 }