Hello all

8 months ago we had a thread about 'ImageInputStream.close()' not being idempotent, which is a violation of 'java.io.Closeable' contract. Joe Darcy suggested that the best way to address the problem would be to make those 'close()' method idempotent [1], but I don't know if there is any follow-up on this topic... But we have just hit another argument in favour of making 'ImageInputStream.close()' idempotent. Looking in 'javax.imageio.ImageIO' Javadoc, we found the following:

 * For ImageIO.read(InputStream), the Javadoc said "This method does
   not close the provided InputStream after the read operation has
   completed; it is the responsibility of the caller to close the
   stream, if desired." [2]

 * But for ImageIO.read(ImageInputStream), the Javadoc said "Unlike
   most other methods in this class, this method does close the
   provided ImageInputStream after the read operation has completed,
   unless null is returned, in which case this method does not close
   the stream." [3]


So the following code work as expected:

    try (InputStream in = getMyImageInputStream()) {
        image = ImageIO.read(in);
    }


But just replacing InputStream by ImageInputStream in the above snipset causes unexpected IOException to be thrown with "stream closed" message, unless (ironically) ImageIO.read(...) fails to recognize the image format. I guess that we can not change the ImageIO specification, but making 'ImageInputStream.close()' idempotent would both makes it conform to the Closeable contract, and avoid the above surprising behaviour.

Is making 'ImageInputStream.close()' idempotent something that could be done? I could contribute patch, but before doing so I would like to know if this is something that the Java2D team consider desirable.

    Thanks,

        Martin Desruisseaux



[1] http://mail.openjdk.java.net/pipermail/2d-dev/2012-June/002607.html
[2] http://download.java.net/jdk8/docs/api/javax/imageio/ImageIO.html#read%28java.io.InputStream%29 [3] http://download.java.net/jdk8/docs/api/javax/imageio/ImageIO.html#read%28javax.imageio.stream.ImageInputStream%29

Reply via email to