On Tue, Nov 24, 2009 at 9:12 AM, Tim Ellison <t.p.elli...@gmail.com> wrote:

> Seems to be caused by a change in the implementation of available() for
> InputStreams on Zip entries.
>
> The failing code is in
> org.apache.harmony.sound.utils.ProviderService#getProviders(String) when
> it tries to read the whole content using available()...
>
> <snip>
>   InputStream in = urls.nextElement()
>           .openStream();
>   bytes = new byte[in.available()];
>   in.read(bytes);
>   in.close();
> <snip>
>

Aahhhh.. gotcha.



> Of course, this is bad form, and when I switch to use the old favourite
> getAllBytesFromStreamAndClose(InputStream) things start working again.
>

Sweet.


> We can debate whether we should try to improve the available() impl or not.
>

If we want to be true to the
spec<http://java.sun.com/javase/6/docs/api/java/util/zip/InflaterInputStream.html#available()>,
we can't change it.


public int *available*()
              throws IOException <../../../java/io/IOException.html>

Returns 0 after EOF has been reached, otherwise always return 1.

Programs should not count on this method to return the actual number of
bytes that could be read without blocking.

*Overrides:*available <../../../java/io/FilterInputStream.html#available()> in
class FilterInputStream <../../../java/io/FilterInputStream.html> *Returns:*1
before EOF and 0 after
EOF.*Throws:*IOException<../../../java/io/IOException.html> -
if an I/O error occurs.

Reply via email to