< prev index next >
src/java.base/share/classes/java/io/InputStream.java
Print this page
@@ -23,11 +23,13 @@
* questions.
*/
package java.io;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.List;
import java.util.Objects;
/**
* This abstract class is the superclass of all classes representing
* an input stream of bytes.
@@ -227,34 +229,59 @@
* be required to store the bytes.
*
* @since 9
*/
public byte[] readAllBytes() throws IOException {
+ List<byte[]> bufs = null;
+ byte[] result = null;
+ int total = 0;
+ int n;
+ do {
byte[] buf = new byte[DEFAULT_BUFFER_SIZE];
- int capacity = buf.length;
int nread = 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;
- // 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;
}
- buf = Arrays.copyOf(buf, capacity);
+ total += nread;
+ if (result == null) {
+ result = buf;
+ } else {
+ if (bufs == null) {
+ bufs = new ArrayList<>();
+ bufs.add(result);
+ }
+ bufs.add(buf);
+ }
+ }
+ } while (n >= 0); // if the last call to read returned -1, then break
+
+ if (bufs == null) {
+ if (result == null) {
+ return new byte[0];
+ }
+ return result.length == total ?
+ result : Arrays.copyOf(result, total);
+ }
+
+ result = new byte[total];
+ int offset = 0;
+ int remaining = total;
+ for (byte[] b : bufs) {
+ int len = Math.min(b.length, remaining);
+ System.arraycopy(b, 0, result, offset, len);
+ offset += len;
+ remaining -= len;
}
- return (capacity == nread) ? buf : Arrays.copyOf(buf, nread);
+
+ return result;
}
/**
* Reads the requested number of bytes from the input stream into the given
* byte array. This method blocks until {@code len} bytes of input data have
< prev index next >