You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何无需完整路径读取Main.java所在源码目录下的TXT文件

解决方案

你遇到的问题是因为 new File("相对路径") 是基于JVM启动时的工作目录解析路径,开发环境下IDE的工作目录默认是项目根目录,不是你写的源码目录,所以会找不到文件;另外绝对路径存在跨平台和部署路径不可预知的问题,用Java的类路径资源加载机制可以完美解决这个问题。

步骤1:调整资源文件存放位置

按照Maven项目标准规范,将所有需要读取的非Java资源(比如README.txt、NOTICE.txt)放到 src/main/resources 目录下,Maven构建时会自动将该目录下的所有文件打包到Jar包的类路径根目录,不需要额外配置。

步骤2:修改资源读取逻辑

不要用 File 类直接读取,改用类加载器从类路径加载资源,这种方式跨平台兼容,不管用户把程序解压到什么路径都能正常读取资源。

注意:Jar包内的资源无法直接作为 File 对象访问,如果需要用 Desktop.open() 打开给用户查看,需要先把资源写入临时文件再打开。

修正后的openFile方法示例

public static void openFile(Scanner a) {
    // 类路径根目录下的NOTICE.txt,开头的/代表从类路径根目录查找
    try (InputStream resourceStream = Main.class.getResourceAsStream("/NOTICE.txt")) {
        if (resourceStream == null) {
            System.out.println("ERROR: 找不到NOTICE资源文件");
            a.nextLine();
            return;
        }
        // 生成临时文件存储资源内容,JVM退出时自动删除
        File tempNoticeFile = File.createTempFile("NOTICE_", ".txt");
        tempNoticeFile.deleteOnExit();
        // 将资源流写入临时文件
        try (FileOutputStream fos = new FileOutputStream(tempNoticeFile)) {
            resourceStream.transferTo(fos);
        }
        // 调用系统默认程序打开临时文件
        if (!Desktop.isDesktopSupported()) {
            System.out.println("ERROR: 当前系统不支持直接打开文件");
            a.nextLine();
            return;
        }
        Desktop.getDesktop().open(tempNoticeFile);
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("ERROR: 打开NOTICE文件失败: " + e.getMessage());
        a.nextLine();
    }
}

其他优化建议

你当前代码中读取pom.xml的逻辑 new FileReader("pom.xml") 仅在开发环境下可以正常运行,打包成Jar后同目录下不会有pom.xml文件,建议通过以下方式获取版本号:

  • 在pom.xml中使用maven-jar-plugin将版本号写入Jar包的MANIFEST.MF文件,运行时读取MANIFEST.MF的版本字段
  • 用maven的资源过滤功能,将版本号占位符写入到properties配置文件中,运行时读取配置文件

内容的提问来源于stack exchange,提问作者DaVinziBoi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:15:01