ee9dd3721b
From-SVN: r26263
113 lines
2.3 KiB
Java
113 lines
2.3 KiB
Java
/* Copyright (C) 1998, 1999 Cygnus Solutions
|
|
|
|
This file is part of libgcj.
|
|
|
|
This software is copyrighted work licensed under the terms of the
|
|
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
|
|
details. */
|
|
|
|
package java.io;
|
|
|
|
import java.util.Enumeration;
|
|
|
|
/**
|
|
* @author Warren Levy <warrenl@cygnus.com>
|
|
* @date November 3, 1998.
|
|
*/
|
|
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
|
|
* "The Java Language Specification", ISBN 0-201-63451-1
|
|
* plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
|
|
* Status: Believed complete and correct.
|
|
*/
|
|
|
|
public class SequenceInputStream extends InputStream
|
|
{
|
|
/* The handle for the current input stream. */
|
|
private InputStream in;
|
|
|
|
/* Secondary input stream; not used if constructed w/ enumeration. */
|
|
private InputStream in2;
|
|
|
|
/* The enum handle; not used if constructed w/ 2 explicit input streams. */
|
|
private Enumeration enum;
|
|
|
|
public SequenceInputStream(Enumeration e)
|
|
{
|
|
// FIXME: Assumes that enum contains only InputStreams.
|
|
enum = e;
|
|
in = (InputStream) enum.nextElement();
|
|
in2 = null;
|
|
}
|
|
|
|
public SequenceInputStream(InputStream s1, InputStream s2)
|
|
{
|
|
in = s1;
|
|
in2 = s2;
|
|
}
|
|
|
|
public int available() throws IOException
|
|
{
|
|
if (in == null)
|
|
return 0;
|
|
|
|
return in.available();
|
|
}
|
|
|
|
public void close() throws IOException
|
|
{
|
|
while (in != null)
|
|
{
|
|
in.close();
|
|
in = getNextStream ();
|
|
}
|
|
}
|
|
|
|
public int read() throws IOException
|
|
{
|
|
int ch = -1;
|
|
|
|
while (in != null && (ch = in.read()) < 0)
|
|
{
|
|
in.close();
|
|
in = getNextStream();
|
|
}
|
|
|
|
return ch;
|
|
}
|
|
|
|
public int read(byte[] b, int off, int len) throws IOException
|
|
{
|
|
int ch = -1;
|
|
|
|
// The validity of the parameters will be checked by in.read so
|
|
// don't bother doing it here.
|
|
while (in != null && (ch = in.read(b, off, len)) < 0)
|
|
{
|
|
in.close();
|
|
in = getNextStream();
|
|
}
|
|
|
|
return ch;
|
|
}
|
|
|
|
private InputStream getNextStream()
|
|
{
|
|
InputStream nextIn = null;
|
|
|
|
// FIXME: Assumes that enum contains only InputStreams.
|
|
if (enum != null)
|
|
{
|
|
if (enum.hasMoreElements())
|
|
nextIn = (InputStream) enum.nextElement();
|
|
}
|
|
else
|
|
if (in2 != null)
|
|
{
|
|
nextIn = in2;
|
|
in2 = null;
|
|
}
|
|
|
|
return nextIn;
|
|
}
|
|
}
|