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