Inlined patch containing also additional java doc changes based on the version 
http://cr.openjdk.java.net/~prappo/ioutil/webrev.01/

It may contain some non proper english ;-)

-Patrick

> Am 27.11.2014 um 14:51 schrieb Alan Bateman <alan.bate...@oracle.com>:
> 
> On 27/11/2014 09:48, Patrick Reinhart wrote:
>> Hi Paul,
>> 
>> Seems not to work. See inline patch…
>> 
>> Patrick
>> 
> In terms of signatures then the methods look like a reasonable start. For the 
> javadoc/spec then there are several issues that will need consideration and 
> you might get some ideas from the javadoc that we have in the existing 
> Files.copy methods - for example, it will need some wording about errors that 
> happen after some (but not all) bytes/chars have been copied, some words to 
> make it clear that the async close or either stream or thread interrupt 
> during the copy is specified to the stream/readers/appendable involved and 
> cannot be specified. It might also be useful to make it clear that IOE is 
> thrown when called when the source or target is closed.
> 
> -Alan.

diff -r 194458fe7339 src/java.base/share/classes/java/io/IOUtil.java
--- a/src/java.base/share/classes/java/io/IOUtil.java   Thu Nov 27 13:50:36 
2014 +0100
+++ b/src/java.base/share/classes/java/io/IOUtil.java   Thu Nov 27 16:08:09 
2014 +0100
@@ -47,10 +47,28 @@
     /**
      * Reads all bytes from an input stream and writes them to an output 
stream.
      *
-     * @param source       the input stream to read from
-     * @param target       the output stream to write to
-     * @return             the number of bytes successfully copied
-     * @throws IOException if an I/O error occurs when reading or writing
+     * <p>  If an I/O error occurs reading from the input stream or writing to
+     * the output stream, then it may do so after the some bytes have been 
read 
+     * or written. Consequently the input stream may not be at end of stream 
and 
+     * may be in an inconsistent state. It is strongly recommended that the 
input
+     * and output stream be promptly closed if an I/O error occurs.
+     *
+     * <p> This method may block indefinitely reading from the input stream (or
+     * writing to the output stream). The behavior for the case that the input 
+     * and output stream is <i>asynchronously closed</i> or the thread 
interrupted
+     * during the copy is highly input and output stream system provider 
specific 
+     * and therefore not specified.
+     *
+     * @param   source
+     *          the input stream to read from
+     * @param   target
+     *          the output stream to write to
+     *
+     * @return  the number of bytes successfully copied
+     * @throws  IOException
+     *          if an I/O error occurs when reading or writing. In particular,
+     *          an <code>IOException</code> may be thrown if the output stream 
+     *          has been closed.
      */
     public static long copy(InputStream source, OutputStream target)
             throws IOException {
@@ -62,16 +80,34 @@
     /**
      * Reads all bytes from an input stream and writes them to an output 
stream.
      *
-     * @param source       the input stream to read from (not {@code null})
-     * @param target       the output stream to write to (not {@code null})
-     * @param buffer       the intermediate buffer to use (not {@code null},
-     *                     and {@code buffer.length >= 1})
-     * @return             the number of bytes successfully copied
-     * @throws IOException if an I/O error occurs when reading or writing
+     * <p>  If an I/O error occurs reading from the input stream or writing to
+     * the output stream, then it may do so after the some bytes have been 
read 
+     * or written. Consequently the input stream may not be at end of stream 
and 
+     * may be in an inconsistent state. It is strongly recommended that the 
input
+     * and output stream be promptly closed if an I/O error occurs.
+     *
+     * <p> This method may block indefinitely reading from the input stream (or
+     * writing to the output stream). The behavior for the case that the input 
+     * and output stream is <i>asynchronously closed</i> or the thread 
interrupted
+     * during the copy is highly input and output stream system provider 
specific 
+     * and therefore not specified.
+     *
+     * @param   source
+     *          the input stream to read from (not {@code null})
+     * @param   target
+     *          the output stream to write to (not {@code null})
+     * @param   buffer
+     *          the intermediate buffer to use (not {@code null},
+     *          and {@code buffer.length >= 1})
+     *
+     * @return  the number of bytes successfully copied
+     * @throws  IOException
+     *          if an I/O error occurs when reading or writing. In particular,
+     *          an <code>IOException</code> may be thrown if the output stream 
+     *          has been closed.
      */
     public static long copy(InputStream source, OutputStream target,
                             byte[] buffer) throws IOException {
-
         Objects.requireNonNull(source, "source");
         Objects.requireNonNull(target, "target");
         Objects.requireNonNull(buffer, "buffer");
@@ -92,23 +128,39 @@
     /**
      * Reads all characters from an readable and writes them to an appendable.
      *
-     * @param source the readable to read from
-     * @param target the appendable to write to
+     * <p>  If an I/O error occurs reading from the readable or writing to the 
+     * appendable, then it may do so after the some characters have been read 
+     * or written. Consequently the readable may not be at end of data and may
+     * be in an inconsistent state. It is strongly recommended that the 
readable
+     * and writable be promptly closed (in case of closables) if an I/O error
+     * occurs.
      *
-     * @return the number of characters successfully read and written
+     * <p> This method may block indefinitely reading from the readable (or
+     * writing to the appendable). The behavior for the case that the input and
+     * appendable is <i>asynchronously closed</i> or the thread interrupted
+     * during the copy is highly readable and appendable system provider 
specific 
+     * and therefore not specified.
      *
-     * @throws IOException if an I/O error occurs when reading or writing
+     * @param   source
+     *          the readable to read from
+     * @param   target
+     *          the appendable to write to
+     *
+     * @return  the number of characters successfully copied
+     *
+     * @throws  IOException
+     *          if an I/O error occurs when reading or writing.
      */
     public static long copy(Readable source, Appendable target) throws 
IOException {
-        long totalRead = 0L;
+        Objects.requireNonNull(source, "source");
+        Objects.requireNonNull(target, "target");
+        long copied = 0L;
         CharBuffer buffer = CharBuffer.allocate(BUFFER_SIZE);
-        int read;
-        while ((read = source.read(buffer)) > -1) {
+        for (int read; (read = source.read(buffer)) > -1; copied += read) {
            buffer.flip();
             target.append(buffer, 0, read);
-            totalRead += read;
         }
-        return totalRead;
+        return copied;
     }
 }
 

Reply via email to