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