Java/IntelliJ中同目录文件触发FileNotFoundException的问题咨询
关于Java文件路径与IntelliJ运行目录的问题解答
核心原因:当前工作目录不匹配
你遇到的问题本质是Java程序运行时的「当前工作目录」和你预期的不一致:
- IntelliJ默认把项目根目录设为运行时的工作目录,而不是你的Main类所在的目录。当你用
./input.txt时,Java会去项目根目录找这个文件,但你的input.txt其实在src目录下(和Main类同目录),所以自然找不到,触发FileNotFoundException。 - 用
src/input.txt能成功,是因为这个路径是相对于项目根目录的,刚好对应文件的实际位置,但这只在IntelliJ的默认配置下有效。
解决办法(从根本上避免环境差异问题)
1. 用类加载器读取资源文件(推荐)
不管是在IntelliJ里运行,还是打包成Jar在其他环境运行,只要文件和类在同一个类路径下,都能通过类加载器读取:
// 读取和Main类同目录的input.txt InputStream inputStream = Main.class.getResourceAsStream("input.txt"); // 如果文件放在resources子目录,路径写成"resources/input.txt"
这种方式的本质是从类路径中查找资源,不受当前工作目录的影响,是Java读取资源文件的标准做法。
2. 临时调整IntelliJ的工作目录(仅适合开发调试)
如果你只想在IntelliJ里用./input.txt读取文件,可以修改运行配置:
- 打开「Run/Debug Configurations」,找到你的Main类运行配置
- 在「Working directory」选项中,改为Main类所在的目录(比如
$MODULE_DIR$/src) - 注意:这种方式只在IntelliJ环境生效,打包后还是会出问题。
3. 遵循标准项目结构
规范的Java项目会把资源文件放在src/main/resources目录下,编译打包时这个目录的文件会自动被放到类路径中,用类加载器就能直接读取,也避免了和Java类文件混放的问题。
为什么非IntelliJ环境用src/input.txt会失败
在非IntelliJ环境(比如直接用javac编译、java命令运行),你的工作目录通常是编译后class文件所在的目录,这时候src目录要么不存在,要么不在当前工作路径的范围内,所以src/input.txt这个路径就失效了。
内容的提问来源于stack exchange,提问作者nalabof679
相关产品推荐
相关产品推荐

