All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.bdeploy.common.util.FixedLengthStream Maven / Gradle / Ivy

Go to download

Public API including dependencies, ready to be used for integrations and plugins.

There is a newer version: 7.3.6
Show newest version
package io.bdeploy.common.util;

import java.io.IOException;
import java.io.InputStream;

/**
 * An input stream that reads a given amount of bytes from a stream.
 */
public class FixedLengthStream extends InputStream {

    /** The underlying stream to read from */
    private final InputStream in;

    /** The number of bytes to read from the stream */
    private long remaining;

    /**
     * Creates a new input stream that reads the given amount from the given stream.
     *
     * @param in the stream to read from
     * @param totalSize the number of bytes to read
     */
    public FixedLengthStream(InputStream in, long totalSize) {
        this.in = in;
        this.remaining = totalSize;
    }

    @Override
    public int read() throws IOException {
        byte[] single = new byte[1];
        int num = read(single, 0, 1);
        return num == -1 ? -1 : (single[0] & 0xFF);
    }

    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        // Signal end of stream if we have consumed all bytes
        if (remaining <= 0) {
            return -1;
        }

        // Read up-to the remaining size
        long bytesToRead = Math.min(len, remaining);
        int numRead = in.read(b, off, (int) bytesToRead);
        if (numRead == -1) {
            throw new IOException("Unexpected end of stream. Expecting '" + remaining + "' bytes.");
        }

        // Provide the number of bytes that where read
        remaining -= numRead;
        return numRead;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy