关于SpringBoot项目通过jar包启动之后无法读取项目根路径静态资源

前言:这个是昨天晚上在部署一个项目的时候发现的,在此记录一下

关于SpringBoot项目通过jar包启动之后无法读取项目根路径静态资源

问题描述

在部署了一个项目之后,打开项目页面进行测试,发现有一个查询页面查询失败了,自动跳转到错误页面,我看了看日志,发现是一个文件读取失败了,如下图:

报错信息

在这里插入图片描述

被读取文件所在目录

在这里插入图片描述

文件读取部分的代码

    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 底下的路径。

PS:也可以到我的个人博客查看更多内容
个人博客地址:小关同学的博客

猜你喜欢

转载自blog.csdn.net/weixin_45784666/article/details/121450856
今日推荐