Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8199355

Further clarify InputStream#available()

XMLWordPrintable

    • Icon: CSR CSR
    • Resolution: Approved
    • Icon: P4 P4
    • 11
    • core-libs
    • None
    • minimal
    • No code is being changed so there is nothing testable.
    • Java API
    • SE

      Summary

      Change specification of InputStream.available() to indicate clearly that 0 may be returned when not at end of stream.

      Problem

      The specification of InputStream.available() does not make it clear that 0 may be returned, even if not at end of stream, i.e., if no bytes may be read but the stream is not exhausted, for example in the case of a socket.

      Solution

      Change the specification of InputStream.available() to state clearly that 0 may be returned, even if not at end of stream.

      Specification

      The proposed specification change is as follows.

           /**
      -     * Returns an estimate of the number of bytes that can be read (or
      -     * skipped over) from this input stream without blocking by the next
      -     * invocation of a method for this input stream. The next invocation
      -     * might be the same thread or another thread.  A single read or skip of this
      -     * many bytes will not block, but may read or skip fewer bytes.
      +     * 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.  The read might be on the same thread or
      +     * another thread.  A single read or skip of this many bytes will not block,
      +     * but may read or skip fewer bytes.
            *
            * <p> Note that while some implementations of {@code InputStream} will return
            * the total number of bytes in the stream, many will not.  It is
            * never correct to use the return value of this method to allocate
            * a buffer intended to hold all data in this stream.
            *
      -     * <p> A subclass' implementation of this method may choose to throw an
      +     * <p> A subclass's implementation of this method may choose to throw an
            * {@link IOException} if this input stream has been closed by
            * invoking the {@link #close()} method.
            *
      -     * <p> The {@code available} method for class {@code InputStream} always
      -     * returns {@code 0}.
      +     * <p> The {@code available} method of {@code InputStream} always returns
      +     * {@code 0}.
            *
            * <p> This method should be overridden by subclasses.
            *
            * @return     an estimate of the number of bytes that can be read (or skipped
            *             over) from this input stream without blocking or {@code 0} when
            *             it reaches the end of the input stream.
            * @exception  IOException if an I/O error occurs.
            */
           public int available() throws IOException {}

            bpb Brian Burkhalter
            webbuggrp Webbug Group
            Alan Bateman, Roger Riggs
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: