提交 7e6594f2 编写于 作者: A alanb

6884800: (file) Path.newInputStream does not usefully implement available()

Reviewed-by: martin, chegar
上级 34df53e6
...@@ -109,6 +109,16 @@ public class ChannelInputStream ...@@ -109,6 +109,16 @@ public class ChannelInputStream
return ChannelInputStream.read(ch, bb, true); return ChannelInputStream.read(ch, bb, true);
} }
public int available() throws IOException {
// special case where the channel is to a file
if (ch instanceof SeekableByteChannel) {
SeekableByteChannel sbc = (SeekableByteChannel)ch;
long rem = Math.max(0, sbc.size() - sbc.position());
return (rem > Integer.MAX_VALUE) ? Integer.MAX_VALUE : (int)rem;
}
return 0;
}
public void close() throws IOException { public void close() throws IOException {
ch.close(); ch.close();
} }
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
*/ */
/* @test /* @test
* @bug 4417152 4481572 6248930 6725399 * @bug 4417152 4481572 6248930 6725399 6884800
* @summary Test Channels basic functionality * @summary Test Channels basic functionality
*/ */
...@@ -225,8 +225,7 @@ public class Basic { ...@@ -225,8 +225,7 @@ public class Basic {
private static void testNewInputStream(File blah) throws Exception { private static void testNewInputStream(File blah) throws Exception {
FileInputStream fis = new FileInputStream(blah); FileInputStream fis = new FileInputStream(blah);
FileChannel fc = fis.getChannel(); FileChannel fc = fis.getChannel();
ReadableByteChannel rbc = (ReadableByteChannel)fc; InputStream is = Channels.newInputStream(fc);
InputStream is = Channels.newInputStream(rbc);
int messageSize = message.length() * ITERATIONS * 3 + 1; int messageSize = message.length() * ITERATIONS * 3 + 1;
byte bb[] = new byte[messageSize]; byte bb[] = new byte[messageSize];
...@@ -234,8 +233,13 @@ public class Basic { ...@@ -234,8 +233,13 @@ public class Basic {
int totalRead = 0; int totalRead = 0;
while (bytesRead != -1) { while (bytesRead != -1) {
totalRead += bytesRead; totalRead += bytesRead;
long rem = Math.min(fc.size() - totalRead, (long)Integer.MAX_VALUE);
if (is.available() != (int)rem)
throw new RuntimeException("available not useful or not maximally useful");
bytesRead = is.read(bb, totalRead, messageSize - totalRead); bytesRead = is.read(bb, totalRead, messageSize - totalRead);
} }
if (is.available() != 0)
throw new RuntimeException("available() should return 0 at EOF");
String result = new String(bb, 0, totalRead, encoding); String result = new String(bb, 0, totalRead, encoding);
int len = message.length(); int len = message.length();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册