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; + } +}