Java使用BufferedReader读取同项目不同包文本文件提示找不到文件错误如何解决
问题产生原因
- 你当前使用的
FileReader是基于操作系统文件系统路径读取文件的,你传入的/park_mp1/src/park/DATA/Data1.txt路径以/开头,会被识别为操作系统根目录下的绝对路径,而非你当前项目内的路径,因此会触发找不到文件的错误。 - Eclipse运行Java程序时,默认工作目录为项目的根目录(即
park_mp1文件夹所在层级),直接写相对路径时是相对于这个工作目录解析,而非相对于你代码所在的包目录解析。 - 若后续你将项目打包为Jar包,
src目录下的资源文件会被打包进Jar包内,不再是独立的文件系统文件,此时用FileReader无论如何都无法直接读取到这类资源。
解决方案
这里提供两种常用的可行方案,你可以根据使用场景选择:
方案1:使用相对于Eclipse工作目录的路径
仅适用开发阶段读取项目源目录下的文件,不需要适配Jar包运行场景:
直接将文件路径修改为相对于项目根目录的相对路径即可,修改后代码如下:
package park.FILEMOD; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class FileModifier { public static void main(String[] args) throws IOException{ // 路径从项目根目录开始写,不需要开头的/ FileReader in = new FileReader("src/park/DATA/Data1.txt"); BufferedReader br = new BufferedReader(in); String line; while ((line = br.readLine()) != null) { System.out.println(line); } in.close(); } }
方案2:使用类加载器从ClassPath读取资源
兼容性更强,开发阶段和打包成Jar包后都可以正常使用,推荐优先使用该方案:
package park.FILEMOD; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; public class FileModifier { public static void main(String[] args) throws IOException{ // 路径开头加/表示从ClassPath根目录开始查找资源 BufferedReader br = new BufferedReader(new InputStreamReader( FileModifier.class.getResourceAsStream("/park/DATA/Data1.txt"), StandardCharsets.UTF_8 )); String line; while ((line = br.readLine()) != null) { System.out.println(line); } br.close(); } }
注意:使用该方案需要保证
Data1.txt会被编译到输出的ClassPath目录中,Eclipse默认会将src目录下的非Java文件复制到编译输出目录,如果没有复制可以右键项目选择Properties->Java Build Path->Source,确认Excluded配置项没有屏蔽txt格式的文件。
内容的提问来源于stack exchange,提问作者dylanpark01
相关产品推荐
相关产品推荐

