V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ouyc
V2EX  ›  Java

JDK 在 Windows11 系统上运行创建`NUL:`文件报错,有哪位大佬知道是什么问题吗?

  •  
  •   ouyc · 2022-06-29 11:16:58 +08:00 · 1830 次点击
    这是一个创建于 913 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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)
    
    15 条回复    2022-07-26 11:51:49 +08:00
    GuuJiang
        1
    GuuJiang  
       2022-06-29 11:20:24 +08:00 via iPhone
    NUL 、CON 、COM 、PRT 这些文件名在 win 上还是避免使用吧,一了百了
    Damn
        2
    Damn  
       2022-06-29 11:24:41 +08:00
    @GuuJiang 这些问题总能暴露年龄
    ouyc
        3
    ouyc  
    OP
       2022-06-29 11:29:43 +08:00
    @GuuJiang
    框架的代码,改不了 emm 。麻烦问下这几个特殊文件在 windows 上是用来干啥的
    ouyc
        4
    ouyc  
    OP
       2022-06-29 11:34:38 +08:00
    换笔记本默认装 windows11 ,还有个台式 windows10 ,昨天项目一直在 windows11 上跑不起来,一直以为是 jdk 、ide 这些的问题,搞得我差点怀疑人生了。今天打断点追着报错看下去,才发现类在静态初始化块中创建了这个文件,然后创建失败报错了,导致 jvm 没加载到这个类。
    pocketz
        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
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    pocketz
        6
    pocketz  
       2022-06-29 11:39:56 +08:00
    DOS 保留设备名包括:CON 作为输入用的文件名,指键盘
    AUX 或 COM1 作为输出用的文件名,指屏幕
    COM2 第一串行口
    COM3 第二串行口
    COM4 第三串行口
    LPT1 或 PRN 第四串行
    LPT1 第一并行口或者打印机
    LPT2 第二并行口
    LPT3 第三并行口
    PRN 打印机
    NUL 空设备

    改了下格式
    ouyc
        7
    ouyc  
    OP
       2022-06-29 11:47:32 +08:00
    找到官方文档对创建文件的描述
    [命名文件、路径和命名空间]( https://docs.microsoft.com/zh-cn/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN)
    jptx
        8
    jptx  
       2022-06-29 11:48:45 +08:00
    你是不是在用 Undertow 作为 web 容器时遇到了这个问题,本地开发启动时加 JVM 参数`-Djdk.io.File.enableADS=true`即可,部署到 Linux 上之后没有这个问题
    hingbong
        9
    hingbong  
       2022-06-29 16:12:26 +08:00
    jdk8u332 出现的 bug 吧
    @jptx
    jptx
        10
    jptx  
       2022-06-29 18:44:43 +08:00
    @hingbong jdk1.8 我没看,我是把 jdk11 升级了小版本后出现的,也没细研究是哪个小版本开始的,只发现了应该是这个 commit 加入的限制: https://github.com/openjdk/jdk/commit/395bb5b7f97f2549da89641257fe56712856b49d
    hingbong
        11
    hingbong  
       2022-06-29 21:09:19 +08:00 via Android
    @jptx 我上次查了,这一批的 8 11 17 都有这个问题🤣
    cppc
        12
    cppc  
       2022-06-30 09:56:40 +08:00
    https://github.com/spring-projects/spring-boot/issues/31112

    升级一下 xnio 的版本,3.8.7.Final 已经解决了。
    cppc
        13
    cppc  
       2022-06-30 09:58:49 +08:00
    @cppc 如果不是 xnio 的问题,也可参考解决方法。
    skai0dev
        14
    skai0dev  
       2022-06-30 14:17:16 +08:00
    twocold0451
        15
    twocold0451  
       2022-07-26 11:51:49 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2844 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 06:09 · PVG 14:09 · LAX 22:09 · JFK 01:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.