ChainedInputStream Example

The following is an example of reading data from a bound stream cyclically using ChainedInputStream.

import std.io.*
import std.collection.ArrayList

main(): Unit {
    const size = 2

    /* Creates two ByteArrayStream instances and writes data to them. */
    let streamArr = Array<InputStream>(size, {_ => ByteArrayStream()})
    for (i in 0..size) {
        match (streamArr[i]) {
            case v: OutputStream =>
                let str = "now ${i}"
                v.write(str.toArray())
            case _ => throw Exception()
        }
    }

    /* Binds the two ByteArrayStream instances to ChainedInputStream. */
    let chainedInputStream = ChainedInputStream(streamArr)
    let res = ArrayList<Byte>()
    let buffer = Array<Byte>(20, item: 0)
    var readLen = chainedInputStream.read(buffer)

    /* Reads data from chainedInputStream cyclically. */
    while (readLen != 0) {
        res.appendAll(buffer[..readLen])
        readLen = chainedInputStream.read(buffer)
    }
    println(String.fromUtf8(res.toArray()))
}

Running result:

now 0now 1