
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 Jun 29, 2022 via iPhone NUL 、CON 、COM 、PRT 这些文件名在 win 上还是避免使用吧,一了百了 |
4 ouyc OP 换笔记本默认装 windows11 ,还有个台式 windows10 ,昨天项目一直在 windows11 上跑不起来,一直以为是 jdk 、ide 这些的问题,搞得我差点怀疑人生了。今天打断点追着报错看下去,才发现类在静态初始化块中创建了这个文件,然后创建失败报错了,导致 jvm 没加载到这个类。 |
5 pocketz Jun 29, 2022 @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 Jun 29, 2022 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 Jun 29, 2022 你是不是在用 Undertow 作为 web 容器时遇到了这个问题,本地开发启动时加 JVM 参数`-Djdk.io.File.enableADS=true`即可,部署到 Linux 上之后没有这个问题 |
10 jptx Jun 29, 2022 @hingbong jdk1.8 我没看,我是把 jdk11 升级了小版本后出现的,也没细研究是哪个小版本开始的,只发现了应该是这个 commit 加入的限制: https://github.com/openjdk/jdk/commit/395bb5b7f97f2549da89641257fe56712856b49d |
12 cppc Jun 30, 2022 |
14 JUSTIGNOREME Jun 30, 2022 |
15 twocold0451 Jul 26, 2022 启动时加参数 -Djdk.io.File.enableADS=true https://stackoverflow.com/questions/71966064/java-fileoutputstreamnul-not-working-after-java-upgrade |