序文:これは、プロジェクトが展開された昨夜に発見されました。ここに記録してください
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クラスメートのブログ