前言:这个是昨天晚上在部署一个项目的时候发现的,在此记录一下
在部署了一个项目之后,打开项目页面进行测试,发现有一个查询页面查询失败了,自动跳转到错误页面,我看了看日志,发现是一个文件读取失败了,如下图:
报错信息
被读取文件所在目录
文件读取部分的代码
public String readFileContent() {
File file = new File("src/main/resources/static/ticket/station_name.txt");
BufferedReader reader = null;
StringBuffer sbf = new StringBuffer();
try {
reader = new BufferedReader(new FileReader(file));
String tempStr;
while ((tempStr = reader.readLine()) != null) {
sbf.append(tempStr);
}
reader.close();
return sbf.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
return sbf.toString();
}
当时我挺懵批的,因为这个文件在本地测试的时候还是能读取到的,为什么到了服务器就找不到了呢???
我上网查阅了一番,发现使用 File 在服务器中来获取本地资源是存在问题的。
原因: Resources 目录下的文件是存在于 xxx.jar 这个文件里面,在服务器磁盘上是没有真实路径存在的,它其实是位于jar内部的一个路径。
解决方法一(笨方法): 将待读取的文件上传到服务器相应目录下,将读取的文件路径改成服务器上面文件对应的路径。
解决方法二: 使用输入流,如下:
public String readFileContent() throws Exception{
String filePath = "static/ticket/station_name.txt";
InputStream inputStream = null;
BufferedReader reader = null;
StringBuffer sbf = new StringBuffer();
//文件读取
inputStream = this.getClass().getClassLoader().getResourceAsStream(filePath);
reader = new BufferedReader(new InputStreamReader(inputStream));
String tempStr;
while ((tempStr = reader.readLine()) != null) {
sbf.append(tempStr);
}
reader.close();
return sbf.toString();
}
public String readFileContent() throws Exception{
String filePath = "static/ticket/station_name.txt";
ClassPathResource resource = new ClassPathResource(filePath);
InputStream inputStream = null;
BufferedReader reader = null;
StringBuffer sbf = new StringBuffer();
//文件读取
inputStream = resource.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream));
String tempStr;
while ((tempStr = reader.readLine()) != null) {
sbf.append(tempStr);
}
reader.close();
return sbf.toString();
}
这里要注意的是,使用的路径是 resources 底下的路径。