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
相关产品推荐
相关产品推荐

