https://bugs.openjdk.java.net/browse/JDK-8022671

Cheers,
David

On 17/03/2021 1:21 pm, Jaikiran Pai wrote:
Please consider this trivial code:

import java.io.*;
import java.nio.file.*;

public class FileTest {
     public static void main(final String[] args) throws Exception {
         System.getProperties().list(System.out);
         final File f = new File("NUL:");
         try (final InputStream fis = Files.newInputStream(f.toPath())) {
                 int numBytes = 0;
                 while (fis.read() != -1) {
                    System.out.println("Files.newInputStream - Read a byte from " + f);
                     numBytes++;
                 }
                System.out.println("Files.newInputStream - Done reading " + numBytes + " bytes from " + f);
         }
     }
}


The code tries to read from NUL: on a Windows setup. This code runs into the following exception on Windows when the java.io.File#toPath() gets invoked:


Exception in thread "main" java.nio.file.InvalidPathException: Illegal char <:> at index 3: NUL:     at java.base/sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:182)     at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:153)     at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)
     at java.base/sun.nio.fs.WindowsPath.parse(WindowsPath.java:92)
    at java.base/sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:230)
     at java.base/java.io.File.toPath(File.java:2316)
     at FileTest.main(FileTest.java:18)


So it looks like java.io.File.toPath() on Windows isn't able to recognize the null device construct?

Just to make sure this issue resides only this specific API implementation, I switched the above code to use new FileInputStream(f) as follows and that works as expected - reads 0 bytes and completes successfully. So the NUL: construct is indeed understood by the other APIs.


public class FileTest {
     public static void main(final String[] args) throws Exception {
         System.getProperties().list(System.out);
         final File f = new File("NUL:");
         try (final FileInputStream fis = new FileInputStream(f)) {
                 int numBytes = 0;
                 while (fis.read() != -1) {
                    System.out.println("FileInputStream() - Read a byte from " + f);
                     numBytes++;
                 }
                System.out.println("FileInputStream() - Done reading " + numBytes + " bytes from " + f);
         }
     }
}

Output:

FileInputStream() - Done reading 0 bytes from NUL:

Test results are from latest Java 16 release on a Windows setup.

-Jaikiran

Reply via email to