Mr Dk.'s BlogMr Dk.'s Blog
  • 🦆 About Me
  • ⛏️ Technology Stack
  • 🔗 Links
  • 🗒️ About Blog
  • Algorithm
  • C++
  • Compiler
  • Cryptography
  • DevOps
  • Docker
  • Git
  • Java
  • Linux
  • MS Office
  • MySQL
  • Network
  • Operating System
  • Performance
  • PostgreSQL
  • Productivity
  • Solidity
  • Vue.js
  • Web
  • Wireless
  • 🐧 How Linux Works (notes)
  • 🐧 Linux Kernel Comments (notes)
  • 🐧 Linux Kernel Development (notes)
  • 🐤 μc/OS-II Source Code (notes)
  • ☕ Understanding the JVM (notes)
  • ⛸️ Redis Implementation (notes)
  • 🗜️ Understanding Nginx (notes)
  • ⚙️ Netty in Action (notes)
  • ☁️ Spring Microservices (notes)
  • ⚒️ The Annotated STL Sources (notes)
  • ☕ Java Development Kit 8
GitHub
  • 🦆 About Me
  • ⛏️ Technology Stack
  • 🔗 Links
  • 🗒️ About Blog
  • Algorithm
  • C++
  • Compiler
  • Cryptography
  • DevOps
  • Docker
  • Git
  • Java
  • Linux
  • MS Office
  • MySQL
  • Network
  • Operating System
  • Performance
  • PostgreSQL
  • Productivity
  • Solidity
  • Vue.js
  • Web
  • Wireless
  • 🐧 How Linux Works (notes)
  • 🐧 Linux Kernel Comments (notes)
  • 🐧 Linux Kernel Development (notes)
  • 🐤 μc/OS-II Source Code (notes)
  • ☕ Understanding the JVM (notes)
  • ⛸️ Redis Implementation (notes)
  • 🗜️ Understanding Nginx (notes)
  • ⚙️ Netty in Action (notes)
  • ☁️ Spring Microservices (notes)
  • ⚒️ The Annotated STL Sources (notes)
  • ☕ Java Development Kit 8
GitHub
  • ☕ Java Development Kit 8
    • java.io

      • Abstract Class - java.io.InputStream
      • Abstract Class - java.io.OutputStream
      • Abstract Class - java.io.Reader
      • Class - java.io.BufferedInputStream
      • Class - java.io.BufferedOutputStream
      • Class - java.io.BufferedReader
      • Class - java.io.ByteArrayInputStream
      • Class - java.io.ByteArrayOutputStream
      • Class - java.io.DataInputStream
      • Class - java.io.DataOutputStream
      • Class - java.io.FileInputStream
      • Class - java.io.FileOutputStream
      • Class - java.io.FileReader
      • Class - java.io.FilterInputStream
      • Class - java.io.FilterOutputStream
      • Class - java.io.InputStreamReader
      • Class - java.io.PipedInputStream
      • Class - java.io.PipedOutputStream
      • Class - java.io.PushbackInputStream
      • Class - java.io.SequenceInputStream
      • Interface - java.io.Closeable
    • java.lang

      • Abstract Class - java.lang.AbstractStringBuilder
      • Class - java.lang.Integer
      • Class - java.lang.String
      • Class - java.lang.ThreadLocal
    • java.nio

      • Abstract Class - java.nio.Buffer
    • java.util

      • Abstract Class - java.util.AbstractCollection
      • Abstract Class - java.util.AbstractList
      • Abstract Class - java.util.AbstractMap
      • Abstract Class - java.util.AbstractQueue
      • Abstract Class - java.util.AbstractSet
      • Class - java.util.ArrayList
      • Class - java.util.HashMap
      • Class - java.util.HashSet
      • Class - java.util.IdentityHashMap
      • Class - java.util.LinkedHashMap
      • Class - java.util.LinkedHashSet
      • Class - java.util.LinkedList
      • Class - java.util.PriorityQueue
      • Class - java.util.TreeMap
      • Class - java.util.TreeSet
      • Interface - java.util.Collection
      • Interface - java.util.Deque
      • Interface - java.util.Iterator
      • Interface - java.util.Iterator
      • Interface - java.util.Map
      • Interface - java.util.NavigableMap
      • Interface - java.util.NavigableSet
      • Interface - java.util.Queue
      • Interface - java.util.Set
      • Interface - java.util.SortedMap
      • Interface - java.util.SortedSet
    • java.util.concurrent

      • Abstract Class - java.util.concurrent.atomic.AtomicIntegerFieldUpdater
      • Abstract Class - java.util.concurrent.locks.AbstractExecutorService
      • Abstract Class - java.util.concurrent.locks.AbstractOwnableSynchronizer
      • Abstract Class - java.util.concurrent.locks.AbstractQueuedSynchronizer
      • Class - java.util.concurrent.ArrayBlockingQueue
      • Class - java.util.concurrent.ConcurrentHashMap
      • Class - java.util.concurrent.ConcurrentLinkedQueue
      • Class - java.util.concurrent.DelayQueue
      • Class - java.util.concurrent.ExecutorCompletionService
      • Class - java.util.concurrent.FutureTask
      • Class - java.util.concurrent.LinkedBlockingQueue
      • Class - java.util.concurrent.LinkedTransferQueue
      • Class - java.util.concurrent.SynchronousQueue
      • Class - java.util.concurrent.ThreadPoolExecutor
      • Class - java.util.concurrent.atomic.AtomicInteger
      • Class - java.util.concurrent.atomic.AtomicIntegerArray
      • Class - java.util.concurrent.atomic.AtomicReference
      • Class - java.util.concurrent.atomic.AtomicStampedReference
      • Class - java.util.concurrent.locks.ReentrantLock
      • Class - java.util.concurrent.locks.ReentrantReadWriteLock
      • Interface - java.util.concurrent.BlockingQueue
      • Interface - java.util.concurrent.CompletionService
      • Interface - java.util.concurrent.Executor
      • Interface - java.util.concurrent.ExecutorService
      • Interface - java.util.concurrent.Future
      • Interface - java.util.concurrent.ScheduledExecutorService
      • Interface - java.util.concurrent.TransferQueue
      • Interface - java.util.concurrent.locks.Lock
      • Interface - java.util.concurrent.locks.ReadWriteLock

Class - java.io.SequenceInputStream

Created by : Mr Dk.

2020 / 09 / 24 10:54

Nanjing, Jiangsu, China


Definition

实现多个输入流之间的逻辑拼接。当一个流读完后,接着去读下一个流。

/**
 * A <code>SequenceInputStream</code> represents
 * the logical concatenation of other input
 * streams. It starts out with an ordered
 * collection of input streams and reads from
 * the first one until end of file is reached,
 * whereupon it reads from the second one,
 * and so on, until end of file is reached
 * on the last of the contained input streams.
 *
 * @author  Author van Hoff
 * @since   JDK1.0
 */
public
class SequenceInputStream extends InputStream {

}

Members

  • e 用于维护所有的输入流集合 - 在一个输入流结束后,通过 e 可以拿到下一个输入流
  • in 用于维护当前正在使用的输入流 - 调用 read() 时,将作用在这个输入流上
Enumeration<? extends InputStream> e;
InputStream in;

Constructor

可以直接使用两个现有输入流直接构造对象。首先将输入流构造到一个 Vector 里,然后调用 Vector 的 .elements() 赋值成员变量 Enumeration<? extends InputStream> e。然后调用 nextStream() 获取第一个 InputStream。

/**
 * Initializes a newly
 * created <code>SequenceInputStream</code>
 * by remembering the two arguments, which
 * will be read in order, first <code>s1</code>
 * and then <code>s2</code>, to provide the
 * bytes to be read from this <code>SequenceInputStream</code>.
 *
 * @param   s1   the first input stream to read.
 * @param   s2   the second input stream to read.
 */
public SequenceInputStream(InputStream s1, InputStream s2) {
    Vector<InputStream> v = new Vector<>(2);

    v.addElement(s1);
    v.addElement(s2);
    e = v.elements();
    try {
        nextStream();
    } catch (IOException ex) {
        // This should never happen
        throw new Error("panic");
    }
}

当然也可以自行构造 Enumeration<? extends InputStream> e 然后直接构造对象。那么这样就支持多个输入流之间的逻辑拼接了。具体的操作方式与上一个函数类似。

/**
 * Initializes a newly created <code>SequenceInputStream</code>
 * by remembering the argument, which must
 * be an <code>Enumeration</code>  that produces
 * objects whose run-time type is <code>InputStream</code>.
 * The input streams that are  produced by
 * the enumeration will be read, in order,
 * to provide the bytes to be read  from this
 * <code>SequenceInputStream</code>. After
 * each input stream from the enumeration
 * is exhausted, it is closed by calling its
 * <code>close</code> method.
 *
 * @param   e   an enumeration of input streams.
 * @see     java.util.Enumeration
 */
public SequenceInputStream(Enumeration<? extends InputStream> e) {
    this.e = e;
    try {
        nextStream();
    } catch (IOException ex) {
        // This should never happen
        throw new Error("panic");
    }
}

NextStream

关闭正在使用的输入流,然后将下一个可用的输入流复制到成员变量 in 中,以便对其进行 read()。只在前一个输入流被读尽时,这个函数才会被调用:

/**
 *  Continues reading in the next stream if an EOF is reached.
 */
final void nextStream() throws IOException {
    if (in != null) {
        in.close();
    }

    if (e.hasMoreElements()) {
        in = (InputStream) e.nextElement();
        if (in == null)
            throw new NullPointerException();
    }
    else in = null;

}

Available

估算目前的输入流中还有多少字节能被读取。

/**
 * Returns an estimate of the number of bytes that can be read (or
 * skipped over) from the current underlying input stream without
 * blocking by the next invocation of a method for the current
 * underlying input stream. The next invocation might be
 * the same thread or another thread.  A single read or skip of this
 * many bytes will not block, but may read or skip fewer bytes.
 * <p>
 * This method simply calls {@code available} of the current underlying
 * input stream and returns the result.
 *
 * @return an estimate of the number of bytes that can be read (or
 *         skipped over) from the current underlying input stream
 *         without blocking or {@code 0} if this input stream
 *         has been closed by invoking its {@link #close()} method
 * @exception  IOException  if an I/O error occurs.
 *
 * @since   JDK1.1
 */
public int available() throws IOException {
    if (in == null) {
        return 0; // no way to signal EOF from available()
    }
    return in.available();
}

Read

当目前的输入流被读尽时,调用 nextStream() 将下一个输入流复制到成员变量 in 中。

/**
 * Reads the next byte of data from this input stream. The byte is
 * returned as an <code>int</code> in the range <code>0</code> to
 * <code>255</code>. If no byte is available because the end of the
 * stream has been reached, the value <code>-1</code> is returned.
 * This method blocks until input data is available, the end of the
 * stream is detected, or an exception is thrown.
 * <p>
 * This method
 * tries to read one character from the current substream. If it
 * reaches the end of the stream, it calls the <code>close</code>
 * method of the current substream and begins reading from the next
 * substream.
 *
 * @return     the next byte of data, or <code>-1</code> if the end of the
 *             stream is reached.
 * @exception  IOException  if an I/O error occurs.
 */
public int read() throws IOException {
    while (in != null) {
        int c = in.read();
        if (c != -1) {
            return c;
        }
        nextStream();
    }
    return -1;
}

/**
 * Reads up to <code>len</code> bytes of data from this input stream
 * into an array of bytes.  If <code>len</code> is not zero, the method
 * blocks until at least 1 byte of input is available; otherwise, no
 * bytes are read and <code>0</code> is returned.
 * <p>
 * The <code>read</code> method of <code>SequenceInputStream</code>
 * tries to read the data from the current substream. If it fails to
 * read any characters because the substream has reached the end of
 * the stream, it calls the <code>close</code> method of the current
 * substream and begins reading from the next substream.
 *
 * @param      b     the buffer into which the data is read.
 * @param      off   the start offset in array <code>b</code>
 *                   at which the data is written.
 * @param      len   the maximum number of bytes read.
 * @return     int   the number of bytes read.
 * @exception  NullPointerException If <code>b</code> is <code>null</code>.
 * @exception  IndexOutOfBoundsException If <code>off</code> is negative,
 * <code>len</code> is negative, or <code>len</code> is greater than
 * <code>b.length - off</code>
 * @exception  IOException  if an I/O error occurs.
 */
public int read(byte b[], int off, int len) throws IOException {
    if (in == null) {
        return -1;
    } else if (b == null) {
        throw new NullPointerException();
    } else if (off < 0 || len < 0 || len > b.length - off) {
        throw new IndexOutOfBoundsException();
    } else if (len == 0) {
        return 0;
    }
    do {
        int n = in.read(b, off, len);
        if (n > 0) {
            return n;
        }
        nextStream();
    } while (in != null);
    return -1;
}

Close

关闭当前输入流之后,关闭后续的所有输入流。

/**
 * Closes this input stream and releases any system resources
 * associated with the stream.
 * A closed <code>SequenceInputStream</code>
 * cannot  perform input operations and cannot
 * be reopened.
 * <p>
 * If this stream was created
 * from an enumeration, all remaining elements
 * are requested from the enumeration and closed
 * before the <code>close</code> method returns.
 *
 * @exception  IOException  if an I/O error occurs.
 */
public void close() throws IOException {
    do {
        nextStream();
    } while (in != null);
}

Edit this page on GitHub
Prev
Class - java.io.PushbackInputStream
Next
Interface - java.io.Closeable