diff options
author | Tom Tromey <tromey@redhat.com> | 2005-01-11 20:04:33 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2005-01-11 20:04:33 +0000 |
commit | 59437d616d40b50faad9b66fc75fee5dbf020f5a (patch) | |
tree | 61f76ba61e9483c05e909e7c3f63f785ead32d36 /libjava/java/io | |
parent | 6c25a4f7cbb1debbe1822ea9135c6b470ba06b6d (diff) | |
download | gcc-59437d616d40b50faad9b66fc75fee5dbf020f5a.tar.gz |
re PR libgcj/18840 (java.io.BufferedInputStream.read(byte[],..) methods don't attempt to read as much as possible)
PR libgcj/18840:
* java/io/BufferedInputStream.java (read): Repeatedly read to
fill buffer.
(refill): Change test to see if buffer must be grown.
From-SVN: r93192
Diffstat (limited to 'libjava/java/io')
-rw-r--r-- | libjava/java/io/BufferedInputStream.java | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/libjava/java/io/BufferedInputStream.java b/libjava/java/io/BufferedInputStream.java index 27fc4b7b49d..5343f0762b6 100644 --- a/libjava/java/io/BufferedInputStream.java +++ b/libjava/java/io/BufferedInputStream.java @@ -1,5 +1,5 @@ /* BufferedInputStream.java -- An input stream that implements buffering - Copyright (C) 1998, 1999, 2001, 2004 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2001, 2004, 2005 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -198,7 +198,7 @@ public class BufferedInputStream extends FilterInputStream { marktarget = marklimit = readlimit; if (marklimit > CHUNKSIZE) - marklimit = CHUNKSIZE; + marklimit = CHUNKSIZE; markpos = pos; } @@ -241,7 +241,10 @@ public class BufferedInputStream extends FilterInputStream * This method reads bytes from a stream and stores them into a caller * supplied buffer. It starts storing the data at index <code>off</code> * into the buffer and attempts to read <code>len</code> bytes. This method - * can return before reading the number of bytes requested. + * can return before reading the number of bytes requested, but it will try + * to read the requested number of bytes by repeatedly calling the underlying + * stream as long as available() for this stream continues to return a + * non-zero value (or until the requested number of bytes have been read). * The actual number of bytes read is returned as an int. A -1 is returned * to indicate the end of the stream. * <p> @@ -263,16 +266,34 @@ public class BufferedInputStream extends FilterInputStream if (off < 0 || len < 0 || b.length - off < len) throw new IndexOutOfBoundsException(); + if (len == 0) + return 0; + if (pos >= count && !refill()) return -1; // No bytes were read before EOF. int totalBytesRead = Math.min(count - pos, len); System.arraycopy(buf, pos, b, off, totalBytesRead); pos += totalBytesRead; + off += totalBytesRead; + len -= totalBytesRead; if (markpos >= 0 && pos - markpos > marktarget) markpos = -1; + while (len > 0 && super.available() > 0 && refill()) + { + int remain = Math.min(count - pos, len); + System.arraycopy(buf, pos, b, off, remain); + pos += remain; + off += remain; + len -= remain; + totalBytesRead += remain; + + if (markpos >= 0 && pos - markpos > marktarget) + markpos = -1; + } + return totalBytesRead; } @@ -311,7 +332,7 @@ public class BufferedInputStream extends FilterInputStream public synchronized long skip(long n) throws IOException { if (buf == null) - throw new IOException("Stream closed."); + throw new IOException("Stream closed."); final long origN = n; @@ -343,7 +364,7 @@ public class BufferedInputStream extends FilterInputStream boolean refill() throws IOException { if (buf == null) - throw new IOException("Stream closed."); + throw new IOException("Stream closed."); if (markpos < 0) count = pos = 0; @@ -357,7 +378,7 @@ public class BufferedInputStream extends FilterInputStream pos -= markpos; markpos = 0; } - else if (marktarget >= buf.length && marklimit < marktarget) // BTW, markpos == 0 + else if (count >= buf.length && count < marktarget) // BTW, markpos == 0 { // Need to grow the buffer now to have room for marklimit bytes. // Note that the new buffer is one greater than marklimit. @@ -378,6 +399,6 @@ public class BufferedInputStream extends FilterInputStream return false; count += numread; - return true; + return numread > 0; } } |