Prefácio: Isso foi descoberto ontem à noite quando um projeto foi implantado, registre-o aqui
Sobre a incapacidade de ler os recursos estáticos do caminho raiz do projeto após o projeto SpringBoot ser iniciado por meio do pacote jar
Descrição do Problema
Depois de implantar um projeto, abri a página do projeto para teste e descobri que uma página de consulta falhou na consulta e pulou automaticamente para a página de erro. Examinei o log e descobri que uma leitura de arquivo falhou, conforme mostrado abaixo:
mensagem de erro
O diretório onde está localizado o arquivo a ser lido
O código para a parte de leitura do arquivo
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();
}
Naquela época, fiquei bastante confuso, pois esse arquivo ainda pode ser lido durante o teste local, por que não pode ser encontrado no servidor? ? ?
Solução
Verifiquei a Internet e descobri que há um problema com o uso de Arquivo para obter recursos locais no servidor.
Motivo:
Os arquivos do diretório Resources existem no arquivo xxx.jar e não existe um caminho real no disco do servidor, na verdade é um caminho dentro do jar.
Solução 1 (método estúpido):
Carregue o arquivo a ser lido no diretório correspondente do servidor e altere o caminho do arquivo lido para o caminho correspondente ao arquivo no servidor.
Solução 2:
use o fluxo de entrada, da seguinte forma:
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();
}
Deve-se notar aqui que o caminho usado é o caminho em recursos.
PS: Você também pode ir ao meu blog pessoal para ver mais conteúdo
Endereço do blog pessoal: Blog do colega de classe Xiaoguan