Java项目编译后无法读取CSV文件问题求助
兄弟,我一眼就看出问题出在相对路径的工作目录差异上,咱们慢慢捋清楚:
为什么VSCode里能正常运行?
VSCode默认会把你的项目根目录(也就是AIR-QUALITY-PROJECT文件夹)作为程序运行的工作目录,所以你写的AIR-QUALITY-PROJECT/lib/1year.csv这个路径,在VSCode里能精准找到对应的文件——毕竟从项目根出发,这个路径是真实存在的。
为什么终端运行就报错?
你说你是在src目录下执行java App命令,这时候程序的工作目录变成了src文件夹!这时候再找AIR-QUALITY-PROJECT/lib/1year.csv,相当于从src目录往上找不存在的AIR-QUALITY-PROJECT文件夹,自然就抛出FileNotFoundException了。
给你几个靠谱的解决方案:
方案1:调整终端的工作目录(最简单临时解决)
别在src目录下运行命令,先切换到你的项目根目录AIR-QUALITY-PROJECT,再运行编译好的App类。比如:
cd /path/to/AIR-QUALITY-PROJECT java src/App
(如果编译后的class文件在bin这类专门的目录,就改成java bin/App)
方案2:使用相对项目根的短路径(简化硬编码)
把路径改成相对项目根的简洁写法:
private static final String PATH = "lib/1year.csv";
然后确保运行程序时工作目录是项目根目录,这样不管在VSCode还是终端(切换到根目录后)都能正常读取。
方案3:用类加载器读取资源(最推荐,适配所有场景)
硬编码路径很容易出问题,尤其是打包成jar之后麻烦更多。最好把lib文件夹当成资源目录,用Java的类加载器来读取文件:
- 确保
lib目录在你的类路径里(VSCode默认会把项目根下的文件夹加入类路径) - 修改读取代码,把
FileInputStream换成类加载器的流:
// 替换原来的FileInputStream初始化代码 InputStream inputStream = DataHandler.class.getResourceAsStream("/lib/1year.csv"); if (inputStream == null) { throw new FileNotFoundException("找不到资源文件lib/1year.csv"); } // 后续用inputStream读取内容,比如用BufferedReader包装 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
这种方式不管你是在VSCode运行、终端运行,还是打包成jar,只要资源在类路径里,都能正确读取,彻底解决路径适配问题。
额外提醒:
你之前把CSV放到根目录、src目录都没用,是因为你硬编码的路径还是AIR-QUALITY-PROJECT/lib/1year.csv,不管文件移到哪,这个路径都不匹配,所以才一直报错。
备注:内容来源于stack exchange,提问作者lordrisser93

