JDK 在 Windows11 系统上运行创建NUL:
文件报错
在 Windows10 系统上运行正常
public class Main {
public static void main(String[] args) throws FileNotFoundException {
FileOutputStream fos = new FileOutputStream("NUL:");
}
}
Windows11 上的报错信息
Exception in thread "main" java.io.FileNotFoundException: Invalid file path
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:229)
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:123)
at com.company.Main.main(Main.java:9)
1
GuuJiang 2022-06-29 11:20:24 +08:00 via iPhone
NUL 、CON 、COM 、PRT 这些文件名在 win 上还是避免使用吧,一了百了
|
4
ouyc OP 换笔记本默认装 windows11 ,还有个台式 windows10 ,昨天项目一直在 windows11 上跑不起来,一直以为是 jdk 、ide 这些的问题,搞得我差点怀疑人生了。今天打断点追着报错看下去,才发现类在静态初始化块中创建了这个文件,然后创建失败报错了,导致 jvm 没加载到这个类。
|
5
pocketz 2022-06-29 11:38:46 +08:00
@ouyc
DOS 保留设备名包括:CON 作为输入用的文件名,指键盘 AUX 或 COM1 作为输出用的文件名,指屏幕 COM2 第一串行口 COM3 第二串行口 COM4 第三串行口 LPT1 或 PRN 第四串行 LPT1 第一并行口或者打印机 LPT2 第二并行口 LPT3 第三并行口 PRN 打印机 NUL 空设备 作者:ivy zheng 链接: https://www.zhihu.com/question/333457846/answer/739121201 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 |
6
pocketz 2022-06-29 11:39:56 +08:00
DOS 保留设备名包括:CON 作为输入用的文件名,指键盘
AUX 或 COM1 作为输出用的文件名,指屏幕 COM2 第一串行口 COM3 第二串行口 COM4 第三串行口 LPT1 或 PRN 第四串行 LPT1 第一并行口或者打印机 LPT2 第二并行口 LPT3 第三并行口 PRN 打印机 NUL 空设备 改了下格式 |
7
ouyc OP 找到官方文档对创建文件的描述
[命名文件、路径和命名空间]( https://docs.microsoft.com/zh-cn/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN) |
8
jptx 2022-06-29 11:48:45 +08:00
你是不是在用 Undertow 作为 web 容器时遇到了这个问题,本地开发启动时加 JVM 参数`-Djdk.io.File.enableADS=true`即可,部署到 Linux 上之后没有这个问题
|
10
jptx 2022-06-29 18:44:43 +08:00
@hingbong jdk1.8 我没看,我是把 jdk11 升级了小版本后出现的,也没细研究是哪个小版本开始的,只发现了应该是这个 commit 加入的限制: https://github.com/openjdk/jdk/commit/395bb5b7f97f2549da89641257fe56712856b49d
|
12
cppc 2022-06-30 09:56:40 +08:00
|
14
skai0dev 2022-06-30 14:17:16 +08:00
|
15
twocold0451 2022-07-26 11:51:49 +08:00
启动时加参数 -Djdk.io.File.enableADS=true
https://stackoverflow.com/questions/71966064/java-fileoutputstreamnul-not-working-after-java-upgrade |