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();
    }

その時、私はかなり混乱していました。ローカルテスト中にこのファイルを読み取ることができるのに、なぜサーバー上で見つからないのでしょうか。

解決

インターネットをチェックしたところ、ファイルを使用してサーバー内のローカルリソースを取得する際に問題があることがわかりました。

理由:
Resourcesディレクトリ内のファイルはファイルxxx.jarに存在し、サーバーディスクに実際のパスはありません。実際にはjar内のパスです。

解決策1(愚かな方法):
読み取るファイルをサーバーの対応するディレクトリにアップロードし、読み取ったファイルのパスをサーバー上のファイルに対応するパスに変更します。

解決策2:
次のように入力ストリームを使用します。

    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();
    }

ここで、使用されるパスはリソースの下のパスであることに注意してください。

PS:私の個人ブログにアクセスして、より多くのコンテンツを表示することもでき
ます。個人ブログのアドレス:Xiaoguanクラスメートのブログ

おすすめ

転載: blog.csdn.net/weixin_45784666/article/details/121450856