Merge "Fix UnionInputStream.read to be more Java-like"
This commit is contained in:
commit
c25ea295e0
|
@ -50,6 +50,7 @@
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
@ -238,4 +239,26 @@ public void close() throws IOException {
|
||||||
assertEquals("I AM A TEST", e.getMessage());
|
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,23 +138,18 @@ else if (in == EOF)
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int read(byte[] b, int off, int len) throws IOException {
|
public int read(byte[] b, int off, int len) throws IOException {
|
||||||
int cnt = 0;
|
if (len == 0)
|
||||||
while (0 < len) {
|
return 0;
|
||||||
|
for (;;) {
|
||||||
final InputStream in = head();
|
final InputStream in = head();
|
||||||
final int n = in.read(b, off, len);
|
final int n = in.read(b, off, len);
|
||||||
if (0 < n) {
|
if (0 < n)
|
||||||
cnt += n;
|
return n;
|
||||||
off += n;
|
else if (in == EOF)
|
||||||
len -= n;
|
return -1;
|
||||||
} else if (in == EOF)
|
else
|
||||||
return 0 < cnt ? cnt : -1;
|
|
||||||
else {
|
|
||||||
pop();
|
pop();
|
||||||
if (0 < cnt)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return cnt;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in New Issue