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

Java 8读取src/main/resources目录文件失败问题咨询

问题分析与解决方案

嘿,你的file1写法确实不正确,这也是很多刚接触Java资源文件读取的开发者容易踩的坑,我来给你拆解清楚:

为啥找不到文件?

当你把orders.csv放在src/main/resources或src/test/resources下时,这些文件在编译(或打包)后会被复制到classpath的根目录中,而不是留在源码目录里。

你用的Paths.get("orders.csv")是从当前工作目录(也就是你启动Java程序时所在的文件夹)去查找文件,这和classpath的路径完全不是一回事——除非你刚好把工作目录设成了src/main/resources,否则肯定找不到文件。

正确的读取方式

不管是Sample.java还是SampleTest.java,都应该通过类加载器来读取classpath中的资源文件,这里有两种靠谱的写法:

方法1:通过类加载器获取资源URL后读取

String fileName = "orders.csv";
// 获取类加载器
ClassLoader classLoader = Sample.class.getClassLoader();
// 从classpath中获取资源的URL
URL resourceUrl = classLoader.getResource(fileName);

if (resourceUrl == null) {
    throw new FileNotFoundException("文件未在classpath中找到:" + fileName);
}

// 转成Path后读取行
try (Stream<String> lines = Files.lines(Paths.get(resourceUrl.toURI()))) {
    // 这里写处理lines的逻辑
    lines.forEach(System.out::println);
} catch (IOException | URISyntaxException e) {
    e.printStackTrace();
}

方法2:直接获取输入流(更推荐,适配JAR包场景)

如果你的程序最终会打包成JAR文件,用这种方式更稳妥——因为JAR里的资源无法直接用Path访问,但输入流可以:

String fileName = "orders.csv";

try (InputStream inputStream = Sample.class.getClassLoader().getResourceAsStream(fileName);
     BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
     Stream<String> lines = reader.lines()) {
    // 处理lines的逻辑
    lines.forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}

额外注意事项

  • 对于SampleTest.java,逻辑完全一样,因为src/test/resources下的文件在测试运行时会被自动加入到测试环境的classpath中。
  • 绝对不要写硬编码的相对路径(比如src/main/resources/orders.csv),因为打包后源码目录就不存在了,程序会直接报错。
  • 如果你用Maven或Gradle构建项目,默认配置已经会自动把resources目录下的文件复制到输出目录,不用额外配置;如果是手动构建,要确保把这些资源文件放到classpath能访问到的位置。

内容的提问来源于stack exchange,提问作者tech_questions

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:54:45