8024788: (fs) Files.readAllBytes uses FileChannel which may not be supported by all providers
authoralanb
Tue, 08 Oct 2013 10:49:09 +0100
changeset 20541 bd0a8b142cb3
parent 20540 1376a380b9ba
child 20542 a7dcd7811f02
child 20741 6eb501508669
child 20751 56898cefcda9
8024788: (fs) Files.readAllBytes uses FileChannel which may not be supported by all providers Reviewed-by: chegar
jdk/src/share/classes/java/nio/file/Files.java
jdk/test/java/nio/file/Files/BytesAndLines.java
--- a/jdk/src/share/classes/java/nio/file/Files.java	Tue Oct 08 11:17:15 2013 +0200
+++ b/jdk/src/share/classes/java/nio/file/Files.java	Tue Oct 08 10:49:09 2013 +0100
@@ -3082,13 +3082,13 @@
      *          method is invoked to check read access to the file.
      */
     public static byte[] readAllBytes(Path path) throws IOException {
-        try (FileChannel fc = FileChannel.open(path);
-             InputStream is = Channels.newInputStream(fc)) {
-            long size = fc.size();
+        try (SeekableByteChannel sbc = Files.newByteChannel(path);
+             InputStream in = Channels.newInputStream(sbc)) {
+            long size = sbc.size();
             if (size > (long)MAX_BUFFER_SIZE)
                 throw new OutOfMemoryError("Required array size too large");
 
-            return read(is, (int)size);
+            return read(in, (int)size);
         }
     }
 
--- a/jdk/test/java/nio/file/Files/BytesAndLines.java	Tue Oct 08 11:17:15 2013 +0200
+++ b/jdk/test/java/nio/file/Files/BytesAndLines.java	Tue Oct 08 10:49:09 2013 +0100
@@ -22,7 +22,9 @@
  */
 
 /* @test
- * @bug 7006126 8020669
+ * @bug 7006126 8020669 8024788
+ * @build BytesAndLines PassThroughFileSystem
+ * @run main BytesAndLines
  * @summary Unit test for methods for Files readAllBytes, readAllLines and
  *     and write methods.
  */
@@ -92,6 +94,16 @@
             byte[] data = Files.readAllBytes(pathStat);
             assertTrue(data.length > 0, "Files.readAllBytes('" + statFile + "') failed to read");
         }
+
+        // test readAllBytes on custom file system
+        Path myfile = PassThroughFileSystem.create().getPath(file.toString());
+        for (int size=0; size<=1024; size+=512) {
+            byte[] b1 = new byte[size];
+            rand.nextBytes(b1);
+            Files.write(myfile, b1);
+            byte[] b2 = Files.readAllBytes(myfile);
+            assertTrue(Arrays.equals(b1, b2), "bytes not equal");
+        }
     }