Java报错FileNotFoundException:文件存在却无法找到的问题求助
解决Java找不到同一包下txt文件的问题
看起来你踩了Java文件路径的常见坑——FileReader的相对路径不是基于你的类所在的包,而是基于程序运行时的当前工作目录!哪怕你的prices_usd.txt和DollarToEur.java在同一个包里,只要运行时工作目录不对,就会触发FileNotFoundException。
下面给你几个靠谱的解决方案,按推荐程度排序:
1. 从类路径读取资源(最推荐,适配所有场景)
因为你的文件和类在同一包下,属于类资源,用类加载器读取是最稳妥的方式——不管是在IDE里运行,还是打包成Jar文件,都能正常找到文件。修改后的代码如下:
import java.io.*; public class DollarToEur { public static void main(String[] args) throws IOException { // 用当前类的类加载器获取同一包下的文件流 try (InputStream inputStream = DollarToEur.class.getResourceAsStream("prices_usd.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); BufferedWriter writer = new BufferedWriter(new FileWriter("converted_prices_eur.txt"))) { String line; // 这里可以根据实际汇率调整 final double USD_TO_EUR_RATE = 0.92; while ((line = reader.readLine()) != null) { try { double usdPrice = Double.parseDouble(line.trim()); double eurPrice = usdPrice * USD_TO_EUR_RATE; // 保留两位小数写入新文件 writer.write(String.format("%.2f", eurPrice)); writer.newLine(); } catch (NumberFormatException e) { System.err.println("跳过无效的价格行: " + line); } } System.out.println("转换完成!已生成 converted_prices_eur.txt"); } catch (NullPointerException e) { System.err.println("错误:找不到 prices_usd.txt,请确认文件和 DollarToEur 类在同一包下"); } } }
为什么这个方法好用?
- 用
try-with-resources语法自动关闭流,不用手动写close(),避免资源泄漏 - 类加载器会自动从类路径(包括Jar包内部)查找资源,打包后也能正常工作
- 增加了异常捕获,能帮你快速定位无效的价格行或文件缺失问题
2. 调整文件到当前工作目录(适合快速测试)
如果你只是想快速跑通代码,可以把prices_usd.txt放到程序的当前工作目录里:
- 在IDE(比如IntelliJ/Eclipse)中,当前工作目录一般是你的项目根目录(比如
your-project/),把文件移到这里,原来的FileReader("prices_usd.txt")就能正常工作了 - 如果你用命令行运行,就把文件放到你执行
java命令的那个文件夹里
3. 使用绝对路径(不推荐,移植性差)
你可以直接写文件的完整绝对路径,比如:
FileReader fr = new FileReader("C:/your-project/src/com/your-package/prices_usd.txt");
但这种方法的问题是,换一台电脑或修改项目路径后,代码就失效了,只适合临时测试用。
内容的提问来源于stack exchange,提问作者Wesley van Straalen
相关产品推荐
相关产品推荐

