You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的工作目录

程序运行时的工作目录默认可能不是项目根目录,导致相对路径失效。按以下步骤设置:

  1. 点击顶部菜单栏的Run -> Edit Configurations
  2. 在弹出窗口中找到你的运行配置(通常是Main)
  3. 在Working directory选项中,选择项目根目录(即project-root文件夹)
  4. 点击Apply和OK保存设置
  5. 重新运行程序,此时src/data/mnist_test.csv的相对路径会基于项目根目录,即可正确找到文件

方案2:使用类路径读取文件(更可靠的方式)

直接依赖工作目录容易出问题,推荐通过类加载器读取类路径下的资源,步骤如下:

  1. 标记资源目录:右键src/data -> Mark Directory as -> Resources Root
  2. 修改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;
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 10:53:11