SpringBoot项目中读取文件的情况汇总

1. 常规使用-绝对路径

1
2
3
4
5
6
7
8
9
10
public String fileB() throws IOException {
File file = new File("D:/learn/Java/fileRead/b.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
StringBuilder res = new StringBuilder();
String s;
while ((s = br.readLine()) != null) {
res.append(s);
}
return res.toString();
}

如上面代码所示,在项目开发时使用绝对路径读取文件的内容

2.常规使用-项目相对路径

1
2
3
4
5
6
7
8
9
10
11
public String fileA() throws IOException {
System.out.println(System.getProperty("user.dir"));
File file = new File("a.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
StringBuilder res = new StringBuilder();
String s;
while ((s = br.readLine()) != null) {
res.append(s);
}
return res.toString();
}

如上面代码所示,在开发中,使用相对路径时,读取的是项目根路径;在SpringBoot项目中为src所在的目录,所以对应的文件需要放在项目根目录,可以使用**System.getProperty(“user.dir”)**查看当前运行所在根目录

image-20231121143901222

3.使用jar包运行读取

当项目打包为jar包单独运行时,同样也可以使用**System.getProperty(“user.dir”)**获取到当前jar包运行的根目录

注意:此时根目录并非jar包所在的目录,而是执行java -jar这条命令时,终端所在的目录

所以在项目部署时,一些文件可以放到jar包所在的config目录,然后使用相对路径就可以读取到文件

1
2
3
4
5
6
7
8
9
10
11
public String fileC() throws IOException {
File file = new File("config/c.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
StringBuilder res = new StringBuilder();
String s;
while ((s = br.readLine()) != null) {
res.append(s);
}
br.close();
return res.toString();
}

4.开发时从resource目录中读取

1
2
3
4
5
6
7
8
9
10
11
12
public String fileD() throws IOException {
String file = Objects.requireNonNull(this.getClass().getClassLoader().getResource("d.txt"))
.getFile();
BufferedReader br = new BufferedReader(new FileReader(file));
StringBuilder res = new StringBuilder();
String s;
while ((s = br.readLine()) != null) {
res.append(s);
}
br.close();
return res.toString();
}

可以将文件放置在项目的resource目录中,其核心是使用**this.getClass().getClassLoader().getResource()**读取文件

注意:this.getClass().getClassLoader().getResource()只能开发时使用,当打包为jar包后运行,会找不到文件

5.打jar包运行时从resource目录中读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public String fileE() throws IOException {
InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("e.txt");
BufferedReader br = null;
if (resourceAsStream != null) {
br = new BufferedReader(new InputStreamReader(resourceAsStream));
}
StringBuilder res = new StringBuilder();
String s;
while ((s = br.readLine()) != null) {
res.append(s);
}
br.close();
return res.toString();
}

最好使用**this.getClass().getClassLoader().getResourceAsStream()**方法读取resource目录下的文件,当使用jar包运行时,依然可以获取到文件


SpringBoot项目中读取文件的情况汇总
http://blog.jingxiang.ltd/2023/11/21/SpringBoot项目中读取文件的情况汇总/
作者
yemangran
发布于
2023年11月21日
许可协议