diff --git a/src/share/classes/sun/nio/ch/ChannelInputStream.java b/src/share/classes/sun/nio/ch/ChannelInputStream.java index 46e3e28b921f58f6085f7c193d51171396c02f4b..f7e12cf0501a86884a68e453217bbf516926d89d 100644 --- a/src/share/classes/sun/nio/ch/ChannelInputStream.java +++ b/src/share/classes/sun/nio/ch/ChannelInputStream.java @@ -109,6 +109,16 @@ public class ChannelInputStream 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 { ch.close(); } diff --git a/test/java/nio/channels/Channels/Basic.java b/test/java/nio/channels/Channels/Basic.java index 3a931a3f4c5e61d8cc17531aa219f3e4bc89ce1f..bfa9f0d404e2ef07f35c8639672a4f4e4d6672e9 100644 --- a/test/java/nio/channels/Channels/Basic.java +++ b/test/java/nio/channels/Channels/Basic.java @@ -22,7 +22,7 @@ */ /* @test - * @bug 4417152 4481572 6248930 6725399 + * @bug 4417152 4481572 6248930 6725399 6884800 * @summary Test Channels basic functionality */ @@ -225,8 +225,7 @@ public class Basic { private static void testNewInputStream(File blah) throws Exception { FileInputStream fis = new FileInputStream(blah); FileChannel fc = fis.getChannel(); - ReadableByteChannel rbc = (ReadableByteChannel)fc; - InputStream is = Channels.newInputStream(rbc); + InputStream is = Channels.newInputStream(fc); int messageSize = message.length() * ITERATIONS * 3 + 1; byte bb[] = new byte[messageSize]; @@ -234,8 +233,13 @@ public class Basic { int totalRead = 0; while (bytesRead != -1) { 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); } + if (is.available() != 0) + throw new RuntimeException("available() should return 0 at EOF"); String result = new String(bb, 0, totalRead, encoding); int len = message.length();