java.io.File#toPath() on Windows doesn't understand "NUL:" (null device)?

Jaikiran Pai jai.forums2013 at gmail.com
Wed Mar 17 03:21:40 UTC 2021


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



More information about the nio-dev mailing list