IntelliJ IDEA中Java程序无法定位CSV文件:FileNotFoundException排查
解决IntelliJ IDEA中Java项目读取CSV文件的FileNotFoundException问题
问题描述
使用Java和IntelliJ IDEA开发字符识别项目时,程序无法从CSV文件加载训练/测试数据,即使文件路径看似正确,仍抛出FileNotFoundException(包装在自定义的IllegalArgumentException中)。
项目结构
project-root/ ├── .idea/ ├── out/ ├── src/ ├── data/ ├── mnist_test.csv ├── mnist_train.csv ├── layers/ ├── network/ └── Main.java └── README.md
核心代码
Main类:
public class Main { public static void main(String[] args) { System.out.println("Starting data loading....."); List<Image> imagesTest = new DataReader().readData("src/data/mnist_test.csv"); List<Image> imagesTrain = new DataReader().readData("src/data/mnist_train.csv"); System.out.println("Images Train size:" + imagesTrain.size()); System.out.println("Images Test size :" + imagesTest.size()); // Other code... } }
DataReader类:
package data; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.List; public class DataReader { private final int rows = 28; private final int cols = 28; public List<Image> readData(String path) { List<Image> images = new ArrayList<>(); try (BufferedReader dataReader = new BufferedReader(new FileReader(path))) { String line; while ((line = dataReader.readLine()) != null) { String[] lineItems = line.split(","); double[][] data = new double[rows][cols]; int label = Integer.parseInt(lineItems[0]); int i = 1; for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { data[row][col] = (double) Integer.parseInt(lineItems[i]); i++; } } images.add(new Image(data, label)); } } catch (Exception e) { throw new IllegalArgumentException("File not found " + path); } return images; } }
错误信息
Exception in thread "main" java.lang.IllegalArgumentException: File not found src/data/mnist_test.csv at data.DataReader.readData(DataReader.java:62) at Main.main(Main.java:23)
已尝试操作
- 确认CSV文件确实位于
src/data/目录下 - 核对代码中的文件路径无误
- 检查过IntelliJ IDEA的工作目录设置,但未找到问题
解决方案
方案1:修正IntelliJ IDEA的工作目录
程序运行时的工作目录默认可能不是项目根目录,导致相对路径失效。按以下步骤设置:
- 点击顶部菜单栏的
Run->Edit Configurations - 在弹出窗口中找到你的运行配置(通常是
Main) - 在
Working directory选项中,选择项目根目录(即project-root文件夹) - 点击
Apply和OK保存设置 - 重新运行程序,此时
src/data/mnist_test.csv的相对路径会基于项目根目录,即可正确找到文件
方案2:使用类路径读取文件(更可靠的方式)
直接依赖工作目录容易出问题,推荐通过类加载器读取类路径下的资源,步骤如下:
- 标记资源目录:右键
src/data->Mark Directory as->Resources Root - 修改
DataReader的readData方法,改用类加载器获取输入流:
public List<Image> readData(String resourcePath) { List<Image> images = new ArrayList<>(); try (InputStream is = getClass().getClassLoader().getResourceAsStream(resourcePath); BufferedReader dataReader = new BufferedReader(new InputStreamReader(is))) { if (is == null) { throw new IllegalArgumentException("Resource not found: " + resourcePath); } String line; while ((line = dataReader.readLine()) != null) { String[] lineItems = line.split(","); double[][] data = new double[rows][cols]; int label = Integer.parseInt(lineItems[0]); int i = 1; for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { data[row][col] = (double) Integer.parseInt(lineItems[i]); i++; } } images.add(new Image(data, label)); } } catch (Exception e) { throw new IllegalArgumentException("Failed to read resource: " + resourcePath, e); } return images; }
- 修改Main类中的调用路径,去掉
src/前缀(资源目录会被编译到类路径下):
List<Image> imagesTest = new DataReader().readData("data/mnist_test.csv"); List<Image> imagesTrain = new DataReader().readData("data/mnist_train.csv");
这种方式不依赖工作目录,无论程序在哪运行,只要资源在类路径下就能读取,更稳定。
内容的提问来源于stack exchange,提问作者senurah
相关产品推荐
相关产品推荐

