RFR: 6445283: ProgressMonitorInputStream not large file aware (>2GB) [v2]

Alexander Zvegintsev azvegint at openjdk.org
Fri Jul 22 13:09:58 UTC 2022


On Fri, 22 Jul 2022 12:19:42 GMT, Prasanta Sadhukhan <psadhukhan at openjdk.org> wrote:

> But it seems in.available() does not change when we read from the stream. For eg, if we read 512 bytes from stream, I would expect (2147483647 -512) bytes but I still see available() returns 2147483647 so this will not work AFICS

It does, you can play with [this](https://gist.github.com/azvegint/65b30efa2749e5af3fae6a247c344677) and provide large file as argument.

However, frequent calling of `available()` may reduce performance, so I agree with your solution.


> I tried creating ByteArrayInputStream of 3GB but it fails with NegativeArraySizeException because of overflow so I am not sure if it's possible.

You can try something like:

InputStream inputStream = new InputStream() {
    final long SIZE = (long) (Integer.MAX_VALUE * 1.5);
    long read = 0;

    @Override
    public int available() {
        return (int) Math.min(SIZE - read, Integer.MAX_VALUE);
    }

    @Override
    public int read() {
        return (SIZE - read++ > 0) ? 1 : -1;
    }
};

-------------

PR: https://git.openjdk.org/jdk/pull/9588



More information about the client-libs-dev mailing list