--- old/src/java.base/share/classes/java/io/InputStream.java 2017-12-19 16:58:17.000000000 -0800 +++ new/src/java.base/share/classes/java/io/InputStream.java 2017-12-19 16:58:17.000000000 -0800 @@ -25,6 +25,7 @@ package java.io; +import java.util.ArrayList; import java.util.Arrays; import java.util.Objects; @@ -229,30 +230,41 @@ * @since 9 */ public byte[] readAllBytes() throws IOException { - byte[] buf = new byte[DEFAULT_BUFFER_SIZE]; - int capacity = buf.length; - int nread = 0; + var bufs = new ArrayList(8); + var buf = new byte[DEFAULT_BUFFER_SIZE]; + int total = 0; int n; - for (;;) { - // read to EOF which may read more or less than initial buffer size - while ((n = read(buf, nread, capacity - nread)) > 0) - nread += n; + do { + int nread = 0; - // if the last call to read returned -1, then we're done - if (n < 0) - break; + // read to EOF which may read more or less than buffer size + while ((n = read(buf, nread, buf.length - nread)) > 0) { + nread += n; + } - // need to allocate a larger buffer - if (capacity <= MAX_BUFFER_SIZE - capacity) { - capacity = capacity << 1; - } else { - if (capacity == MAX_BUFFER_SIZE) + if (nread > 0) { + if (MAX_BUFFER_SIZE - total < nread) { throw new OutOfMemoryError("Required array size too large"); - capacity = MAX_BUFFER_SIZE; + } + total += nread; + var copy = (n < 0 && nread == DEFAULT_BUFFER_SIZE) ? + buf : Arrays.copyOf(buf, nread); + bufs.add(copy); } - buf = Arrays.copyOf(buf, capacity); + } while (n >= 0); // if the last call to read returned -1, then break + + if (bufs.size() == 1) { + return bufs.get(0); + } + + var result = new byte[total]; + int offset = 0; + for (var b : bufs) { + System.arraycopy(b, 0, result, offset, b.length); + offset += b.length; } - return (capacity == nread) ? buf : Arrays.copyOf(buf, nread); + + return result; } /**