Library enhancement proposal for copying data from/to Reader/Writer InputStream/OutputStream

Patrick Reinhart patrick at reini.net
Thu Nov 27 09:48:21 UTC 2014


Hi Paul,

Seems not to work. See inline patch…

Patrick


> Hi Paul,
> 
> Attached a patch containing my complete proposed code including tests.
> 
> Patrick

--- /dev/null	2014-11-24 08:00:19.282694686 +0100
+++ new/src/java.base/share/classes/java/io/IOUtil.java	2014-11-27 10:33:39.955791833 +0100
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package java.io;
+
+import java.nio.CharBuffer;
+
+/**
+ * Utility methods for copying data between a {@link InputStream} and
+ * {@link OutputStream} or between a {@link Readable} and a {@link Appendable}.
+ */
+public final class IOUtil {
+
+    // buffer size used for reading and writing
+    private static final int BUFFER_SIZE = 8192;
+
+    private IOUtil() {
+        throw new Error("no instances");
+    }
+
+    /**
+     * 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 read and written
+     *
+     * @throws IOException if an I/O error occurs when reading or writing
+     */
+    public static long copy(InputStream source, OutputStream target)
+            throws IOException {
+        long totalRead = 0L;
+        byte[] buffer = new byte[BUFFER_SIZE];
+        int read;
+        while ((read = source.read(buffer)) > -1) {
+            target.write(buffer, 0, read);
+            totalRead += read;
+        }
+        return totalRead;
+    }
+
+    /**
+     * 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
+     *
+     * @return the number of characters successfully read and written
+     *
+     * @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;
+        CharBuffer buffer = CharBuffer.allocate(BUFFER_SIZE);
+        int read;
+        while ((read = source.read(buffer)) > -1) {
+	    buffer.flip();
+            target.append(buffer, 0, read);
+            totalRead += read;
+        }
+        return totalRead;
+    }
+}
--- /dev/null	2014-11-24 08:00:19.282694686 +0100
+++ new/test/java/io/IOUtil/CopyInputStreamOutputStream.java	2014-11-27 10:33:40.352791912 +0100
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOUtil;
+import java.util.Arrays;
+
+/* @test
+   @summary Test copy a InputStream to a OutputStream reporting the amount 
+            of bytes copied in total.
+ */
+public class CopyInputStreamOutputStream {
+
+    public static void main(String[] args) throws Exception {
+        new CopyInputStreamOutputStream().go();
+    }
+
+
+    private void go() throws Exception {
+        byte[] data = LoremIpsum.getBytes();
+        ByteArrayInputStream in = new ByteArrayInputStream(data);
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+        if (IOUtil.copy(in, out) != data.length) {
+            throw new Exception("expected amount of copied bytes wrong");
+        }
+
+        if (!Arrays.equals(data, out.toByteArray())) {
+            throw new Exception("copied data wrong");
+        }
+    }
+}
--- /dev/null	2014-11-24 08:00:19.282694686 +0100
+++ new/test/java/io/IOUtil/CopyReadableAppendable.java	2014-11-27 10:33:40.722791986 +0100
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.IOUtil;
+import java.io.StringReader;
+
+/* @test
+   @summary Test copy a Readable to a Appendable reporting the amount 
+            of characters copied in total.
+ */
+public class CopyReadableAppendable {
+
+    public static void main(String[] args) throws Exception {
+        new CopyReadableAppendable().go();
+    }
+
+
+    private void go() throws Exception {
+        String data = LoremIpsum.getString();
+        StringReader in = new StringReader(data);
+        StringBuilder out = new StringBuilder();
+
+        if (IOUtil.copy(in, out) != data.length()) {
+            throw new Exception("expected amount of copied characters wrong");
+        }
+
+        if (!data.equals(out.toString())) {
+            throw new Exception("copied data wrong");
+        }
+    }
+}
--- /dev/null	2014-11-24 08:00:19.282694686 +0100
+++ new/test/java/io/IOUtil/LoremIpsum.java	2014-11-27 10:33:41.070792056 +0100
@@ -0,0 +1,219 @@
+/*
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+public class LoremIpsum {
+    private static String LOREM_IPSUM = "Lorem ipsum dolor sit amet, "
+            + "consectetur adipiscing elit. Phasellus semper mi at ex "
+            + "aliquet, vitae dapibus tortor egestas. Duis convallis "
+            + "nunc non lorem faucibus, non tincidunt lacus elementum. "
+            + "Suspendisse suscipit porttitor enim, ac volutpat felis "
+            + "efficitur nec. Donec lacinia quam id dictum blandit. Sed "
+            + "urna odio, commodo laoreet convallis non, molestie vel "
+            + "tortor. Pellentesque maximus accumsan lectus nec aliquet. "
+            + "Nullam ut vestibulum elit. Integer laoreet leo in velit "
+            + "lobortis, non hendrerit est mollis. Etiam sed mauris et "
+            + "lacus viverra posuere eget sed mi. Nulla turpis dui, semper "
+            + "sit amet vehicula vitae, scelerisque imperdiet nisi. Morbi "
+            + "ac porttitor quam. Nullam id diam lectus. In erat mi, "
+            + "imperdiet in elit at, ultricies sollicitudin leo. Maecenas "
+            + "sit amet eros placerat, posuere purus vel, semper mi. "
+            + "Vivamus ornare viverra velit vel congue."
+            + "\n\n"
+            + "Nam sapien enim, ullamcorper non urna a, lacinia placerat "
+            + "libero. Donec gravida metus eget justo consequat pretium. "
+            + "Mauris venenatis, massa non ultricies suscipit, tortor "
+            + "tellus pharetra massa, at luctus tortor quam tincidunt "
+            + "mauris. Maecenas fermentum, ex eget volutpat sagittis, "
+            + "nibh risus molestie mauris, quis mattis ex lacus nec erat. "
+            + "Vestibulum vel iaculis tortor, eget tempor lorem. "
+            + "Suspendisse sodales lacinia ligula nec commodo. Morbi "
+            + "elementum ultricies arcu, sed sagittis mi sollicitudin sed. "
+            + "Curabitur hendrerit ante vitae nunc convallis, a feugiat "
+            + "nisi pulvinar."
+            + "\n\n"
+            + "Nam sollicitudin ultricies elit at tincidunt. Vestibulum "
+            + "ut elementum ipsum, sit amet tincidunt arcu. Interdum et "
+            + "malesuada fames ac ante ipsum primis in faucibus. Mauris "
+            + "ut tempor ipsum. Suspendisse vehicula justo sit amet ultricies "
+            + "gravida. Fusce pharetra lorem eu elit fringilla, tincidunt "
+            + "gravida velit malesuada. Suspendisse euismod odio ligula, et "
+            + "pharetra arcu feugiat id. Pellentesque dignissim quam eu "
+            + "urna hendrerit lobortis. Maecenas vulputate fringilla augue, "
+            + "et sollicitudin urna molestie ac. Maecenas eget sollicitudin "
+            + "mi. Aenean justo arcu, condimentum et nisl id, faucibus "
+            + "pulvinar orci. Praesent in tristique eros, non consequat nisl. "
+            + "In cursus orci et pellentesque facilisis. Vivamus scelerisque "
+            + "nisl sit amet velit accumsan dictum. Proin vestibulum nulla "
+            + "vel elit molestie, quis molestie sapien porttitor. Proin "
+            + "suscipit mollis enim, in convallis dui commodo eu."
+            + "\n\n"
+            + "Nam in elit placerat, vulputate lacus sed, tempor mi. Cras "
+            + "hendrerit nibh enim, sed viverra orci gravida eu. Proin "
+            + "egestas massa vitae ornare iaculis. In sed erat orci. "
+            + "Praesent a massa vehicula, mattis nunc eu, blandit nulla. "
+            + "Morbi luctus justo sit amet est volutpat facilisis. "
+            + "Aliquam vehicula justo non erat tempor, vitae sollicitudin "
+            + "risus rhoncus. Suspendisse non sem lacus. Duis tellus leo, "
+            + "tincidunt quis lorem ac, elementum pharetra tortor. Praesent "
+            + "sit amet tempus orci, non tempus est. Fusce auctor leo et "
+            + "cursus venenatis. Nunc dapibus ut ipsum id consectetur. "
+            + "Curabitur faucibus metus quis leo tempus condimentum."
+            + "\n\n"
+            + "Sed sodales elit nec laoreet pellentesque. Sed condimentum "
+            + "risus quis lectus condimentum, varius suscipit turpis "
+            + "sagittis. Phasellus consequat metus eget odio fringilla "
+            + "bibendum. Vivamus fermentum est et elit congue, vitae varius "
+            + "dui egestas. Nunc sed nunc quis felis lobortis faucibus. "
+            + "Integer at purus quis urna posuere pulvinar at at erat. "
+            + "Etiam finibus erat quis nisi fermentum interdum. Sed non "
+            + "velit nec justo ultrices ultrices. Praesent vitae eros id "
+            + "dolor commodo viverra et in lorem. Duis non lacus quis nulla "
+            + "ultricies aliquet ut id nibh. Aliquam erat volutpat. Proin "
+            + "tincidunt est in feugiat sagittis. Phasellus quis maximus "
+            + "felis, vel volutpat enim. Aenean convallis ipsum eu orci "
+            + "posuere aliquam. Donec et tristique nibh, id ultricies eros."
+            + "\n\n"
+            + "Duis semper nulla nec pharetra hendrerit. Proin nibh lorem, "
+            + "condimentum sed sem at, malesuada sollicitudin urna. Etiam "
+            + "id augue sit amet lectus volutpat ullamcorper finibus a "
+            + "velit. Sed lacinia enim quis sem sollicitudin, vel faucibus "
+            + "leo elementum. Etiam convallis felis sed tortor iaculis "
+            + "tristique. Nulla at est in ligula pulvinar porta vel "
+            + "interdum felis. Vivamus nec mattis metus, quis imperdiet "
+            + "ligula. Aliquam sed arcu arcu. Curabitur at consectetur sem. "
+            + "Morbi volutpat non eros ac ultrices. Nulla nunc urna, "
+            + "dignissim eget vestibulum at, molestie vitae justo. Mauris "
+            + "et enim quis est rhoncus laoreet eu nec ex."
+            + "\n\n"
+            + "In lobortis sodales quam sed fermentum. In quis fermentum "
+            + "arcu. Integer tincidunt, nisi at consequat laoreet, turpis "
+            + "arcu egestas metus, a fringilla nisl justo id urna. "
+            + "Suspendisse iaculis, urna eu eleifend ultrices, justo dolor "
+            + "tempus sapien, eu fermentum leo dolor a erat. Integer vitae "
+            + "egestas risus. Donec lacinia ac neque at fermentum. Class "
+            + "aptent taciti sociosqu ad litora torquent per conubia "
+            + "nostra, per inceptos himenaeos. Maecenas blandit ex enim, "
+            + "vel commodo lectus gravida id. Pellentesque aliquet dapibus "
+            + "consectetur."
+            + "\n\n"
+            + " Vestibulum maximus vitae nisi non tempus. Mauris rutrum "
+            + "rhoncus rutrum. Donec placerat, eros ut lacinia gravida, "
+            + "nunc lectus laoreet est, a ultricies dolor tellus non nulla. "
+            + "Aenean nibh eros, porttitor nec tortor in, vulputate "
+            + "porttitor elit. Nulla facilisi. Praesent a porta urna, non "
+            + "aliquam diam. Vestibulum ultricies turpis ut lectus "
+            + "vulputate, eu condimentum lorem consectetur. Lorem ipsum "
+            + "dolor sit amet, consectetur adipiscing elit. Quisque "
+            + "posuere nibh sed augue venenatis posuere. Cras pretium "
+            + "neque nec tristique tincidunt."
+            + "\n\n"
+            + "In tortor tellus, eleifend eget mattis ut, pellentesque "
+            + "ac ex. Phasellus rhoncus consectetur leo non aliquam. "
+            + "Suspendisse pellentesque purus quis consectetur congue. "
+            + "Fusce posuere arcu nisi. Nunc non lectus in lacus molestie "
+            + "maximus sed ut lacus. Integer tincidunt purus quis arcu "
+            + "pretium, at sodales erat fermentum. Praesent ornare "
+            + "sagittis euismod. Aliquam suscipit elit ut condimentum "
+            + "accumsan."
+            + "\n\n"
+            + "Mauris dignissim quam ut odio vehicula interdum eget "
+            + "eget enim. Vivamus rutrum ut felis vel volutpat. Duis "
+            + "aliquam dapibus maximus. Suspendisse fringilla blandit "
+            + "urna, ut finibus lacus tincidunt sed. Proin vel accumsan "
+            + "ipsum. Nullam dictum metus vel accumsan varius. Ut "
+            + "accumsan volutpat justo id gravida."
+            + "\n\n"
+            + "Proin lectus purus, tempus nec nibh in, convallis "
+            + "tempor magna. Quisque et scelerisque mauris. Quisque "
+            + "pharetra a arcu quis viverra. Quisque sed felis nisi. "
+            + "Interdum et malesuada fames ac ante ipsum primis in "
+            + "faucibus. Duis iaculis, elit vel dignissim congue, "
+            + "magna nisi tristique sapien, semper porta eros velit "
+            + "efficitur elit. Ut eget congue nisi, at luctus ipsum. "
+            + "Etiam ac elit sit amet ex tempor congue."
+            + "\n\n"
+            + "Aenean dictum ullamcorper mi, sed facilisis orci "
+            + "porttitor sit amet. Aliquam venenatis sapien vel leo "
+            + "pellentesque, iaculis aliquet augue tincidunt. Aenean "
+            + "posuere aliquet bibendum. Cum sociis natoque penatibus "
+            + "et magnis dis parturient montes, nascetur ridiculus "
+            + "mus. Vivamus gravida elit ac convallis lobortis. In "
+            + "hac habitasse platea dictumst. Sed ullamcorper mauris "
+            + "vitae ante sagittis finibus. Integer scelerisque orci "
+            + "sit amet nulla imperdiet, ac placerat lectus feugiat. "
+            + "Vestibulum sed dui tortor. Donec vitae dictum tortor."
+            + "\n\n"
+            + "Etiam porttitor dolor neque, ut ullamcorper tortor "
+            + "vulputate porta. Quisque vel lectus vel tellus "
+            + "hendrerit tincidunt. Nulla et luctus ligula. In vitae "
+            + "nulla non ex lobortis condimentum quis vitae tellus. "
+            + "Donec at arcu sit amet velit dictum euismod. Donec "
+            + "bibendum vel erat eget tincidunt. Etiam efficitur in "
+            + "odio ac aliquam. Nulla sodales vestibulum suscipit. "
+            + "Aliquam in venenatis ex. Maecenas rhoncus eleifend "
+            + "lobortis. Phasellus pharetra ligula eget pretium "
+            + "viverra. Cras ut pretium lorem."
+            + "\n\n"
+            + "Pellentesque eu tellus malesuada, varius leo quis, "
+            + "eleifend tortor. Mauris aliquet, massa in tincidunt "
+            + "egestas, neque orci luctus nisl, sit amet viverra "
+            + "risus nisl quis eros. Donec quis posuere justo. "
+            + "Curabitur nunc enim, sagittis at ligula eu, placerat "
+            + "pellentesque turpis. Quisque gravida nisl sed purus "
+            + "pulvinar, et ultricies massa tempor. Suspendisse "
+            + "interdum porttitor neque, pretium sagittis felis "
+            + "efficitur et. Quisque mollis placerat purus vel "
+            + "elementum. Quisque finibus, lectus aliquam rutrum "
+            + "efficitur, nisl sapien elementum purus, at pretium "
+            + "tellus quam vel mi. Nunc non dictum tortor. In sit "
+            + "amet sem sit amet erat gravida fringilla at in ipsum. "
+            + "In pretium massa vulputate imperdiet vulputate. "
+            + "Vivamus placerat, velit sed facilisis posuere, felis "
+            + "felis bibendum velit, ut gravida purus mauris non "
+            + "diam. Integer elementum libero augue, in pharetra "
+            + "felis scelerisque nec."
+            + "\n\n"
+            + " Etiam eu tellus ac lectus vulputate aliquet nec id "
+            + "mi. Donec eget neque vel ex lobortis sollicitudin. "
+            + "Curabitur quis ante eget sem cursus dignissim sed "
+            + "at ligula. Suspendisse mollis eget erat sit amet "
+            + "ornare. Donec laoreet convallis elementum. Aliquam "
+            + "mauris diam, porttitor eget ligula consequat, "
+            + "rhoncus hendrerit tellus. Sed ante tellus, tempor "
+            + "a ipsum nec, tempus auctor odio. Proin facilisis "
+            + "at urna eget maximus. Nulla vitae tempor nisi. "
+            + "Fusce a odio cursus, vestibulum nulla id, accumsan "
+            + "nisl."
+            + "\n\n"
+            + "Fusce sed varius massa, nec blandit velit. Integer "
+            + "vitae lacinia ligula. Mauris vestibulum sem ut "
+            + "blandit cras amet.";
+
+    public static byte[] getBytes() {
+        return LOREM_IPSUM.getBytes();
+    }
+
+    public static String getString() {
+        return LOREM_IPSUM;
+    }
+}




More information about the core-libs-dev mailing list