summaryrefslogtreecommitdiff
path: root/libjava/java/io
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2005-01-11 20:04:33 +0000
committerTom Tromey <tromey@gcc.gnu.org>2005-01-11 20:04:33 +0000
commit59437d616d40b50faad9b66fc75fee5dbf020f5a (patch)
tree61f76ba61e9483c05e909e7c3f63f785ead32d36 /libjava/java/io
parent6c25a4f7cbb1debbe1822ea9135c6b470ba06b6d (diff)
downloadgcc-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.java35
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;
}
}