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
相关产品推荐
相关产品推荐

