Fix UnionInputStream.read to be more Java-like
Relax the read() method to not block until exactly "len" bytes have been read. Instead, return when one or more bytes have been read, up to "len", so UnionInputStream more closely resembles InputStream's read() method. Change-Id: I3f632be8eb85a4a0baf27c9f067c8d817162de2b
This commit is contained in:
parent
9000351909
commit
590e8f44e6
|
@ -50,6 +50,7 @@
|
|||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.junit.Test;
|
||||
|
@ -238,4 +239,26 @@ public void close() throws IOException {
|
|||
assertEquals("I AM A TEST", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNonBlockingPartialRead() throws Exception {
|
||||
InputStream errorReadStream = new InputStream() {
|
||||
@Override
|
||||
public int read() throws IOException {
|
||||
throw new IOException("Expected");
|
||||
}
|
||||
};
|
||||
final UnionInputStream u = new UnionInputStream(
|
||||
new ByteArrayInputStream(new byte[]{1,2,3}),
|
||||
errorReadStream);
|
||||
byte buf[] = new byte[10];
|
||||
assertEquals(3, u.read(buf, 0, 10));
|
||||
assertTrue(Arrays.equals(new byte[] {1,2,3}, slice(buf, 3)));
|
||||
try {
|
||||
u.read(buf, 0, 1);
|
||||
fail("Expected exception from errorReadStream");
|
||||
} catch (IOException e) {
|
||||
assertEquals("Expected", e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -138,24 +138,19 @@ else if (in == EOF)
|
|||
|
||||
@Override
|
||||
public int read(byte[] b, int off, int len) throws IOException {
|
||||
int cnt = 0;
|
||||
while (0 < len) {
|
||||
if (len == 0)
|
||||
return 0;
|
||||
for (;;) {
|
||||
final InputStream in = head();
|
||||
final int n = in.read(b, off, len);
|
||||
if (0 < n) {
|
||||
cnt += n;
|
||||
off += n;
|
||||
len -= n;
|
||||
} else if (in == EOF)
|
||||
return 0 < cnt ? cnt : -1;
|
||||
else {
|
||||
if (0 < n)
|
||||
return n;
|
||||
else if (in == EOF)
|
||||
return -1;
|
||||
else
|
||||
pop();
|
||||
if (0 < cnt)
|
||||
break;
|
||||
}
|
||||
}
|
||||
return cnt;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int available() throws IOException {
|
||||
|
|
Loading…
Reference in New Issue