6884800: (file) Path.newInputStream does not usefully implement available()
authoralanb
Sun, 04 Oct 2009 15:42:00 +0100
changeset 3955 a585e5ca5e4a
parent 3954 19ed60dbd0b7
child 3956 2586d23078e4
6884800: (file) Path.newInputStream does not usefully implement available() Reviewed-by: martin, chegar
jdk/src/share/classes/sun/nio/ch/ChannelInputStream.java
jdk/test/java/nio/channels/Channels/Basic.java
--- 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();