6884800: (file) Path.newInputStream does not usefully implement available()
Reviewed-by: martin, chegar
--- a/jdk/src/share/classes/sun/nio/ch/ChannelInputStream.java Fri Oct 02 08:49:25 2009 -0700
+++ b/jdk/src/share/classes/sun/nio/ch/ChannelInputStream.java Sun Oct 04 15:42:00 2009 +0100
@@ -109,6 +109,16 @@
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();
}
--- a/jdk/test/java/nio/channels/Channels/Basic.java Fri Oct 02 08:49:25 2009 -0700
+++ b/jdk/test/java/nio/channels/Channels/Basic.java Sun Oct 04 15:42:00 2009 +0100
@@ -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 @@
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 @@
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();