RFR: 6445283: ProgressMonitorInputStream not large file aware (>2GB)
Alexander Zvegintsev
azvegint at openjdk.org
Fri Jul 22 12:11:48 UTC 2022
On Fri, 22 Jul 2022 09:11:25 GMT, Prasanta Sadhukhan <psadhukhan at openjdk.org> wrote:
> Yes, the tracker closes when it reaches MAX INT limit 2147483647 since the progress tracking method setProgress() accepts "int". We can keep the progress meter at end ie 100% without closing even after reading 2147483647 bytes, till it reaches EOF or we could add new setProgress() method with long as you suggested. I had thought about it but was not sure about the practicality of this scenario, so just thought of addressing by closing the tracker. Also, InputStream.available() returns an "int" so I guessed filesize > MAX_INT is not supported which is another reason I did not go for "long"
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/InputStream.html#available()
>Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking, which may be 0, or 0 when end of stream is detected.
So `InputStream.available()` is not intended to get a real input stream data length.
Maybe we should work with `InputStream.available()` not only in constructor, but in `ProgressMonitorInputStream.read()` methods too, since `available()` value can change during the data read.
For example, we have `FileInputStream` with a 4GB file:
- at the beginning we have MAX INT `available()`
- after 1GB read we still have MAX INT available
but
- after 3GB read we have 1GB available
- after 4GB read we have 0 available
And we can somehow update progress bar based on this data.
-------------
PR: https://git.openjdk.org/jdk/pull/9588
More information about the client-libs-dev
mailing list