8024788: (fs) Files.readAllBytes uses FileChannel which may not be supported by all providers
Reviewed-by: chegar
--- 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");
+ }
}