getClass().getResource no java

Bom dia Pessoal, coloquei um arquivo na pasta src/main/resources/doc/Presencas_Regatas_Abril_2016.xls e fiz a seguinte rotina:
String filePath = this.getClass().getResource("/doc/Presencas_Regatas_Abril_2016.xls").getPath();
File file = new File(filePath);

	if(file.exists()){
        System.out.println("existe o arquivo");			
    } else {
    	System.out.println("Não EXISTE O ARQUIVO");
    }	

quando eu rodo local, aparece sempre a mensagem “existe o arquivo”, porém quando faço o deployd no Heroku aparece a mensagem que “Não EXISTE O ARQUIVO”
2019-07-15T12:17:29.065752+00:00 app[web.1]: jar:file:/app/target/regatas-api-1.0.0-SNAPSHOT.jar!/BOOT-INF/classes!/doc/Presencas_Regatas_Abril_2016.xls
2019-07-15T12:17:29.066162+00:00 app[web.1]: Não EXISTE O ARQUIVO

Alguém pode me ajudar ??

O método .getResource retorna um objeto URL correspondente ao caminho no disco do artefato desejado.

Para obter artefatos de dentro do seu JAR, utilize .getResourceAsStream, que retorna um InputStream para você ler os bytes dele.

1 curtida

Tentei fazer assim e mesmo problema Local funciona, no heroku não funciona

	Resource resource = new ClassPathResource("/doc/Presencas_Regatas_Abril_2016.xls");

	try {
		InputStream input = resource.getInputStream();
		File file11 = resource.getFile();
		
		if(file11.exists()){
            System.out.println(" file11 existe o arquivo");
        } else {
        	System.out.println(" file11 Não EXISTE O ARQUIVO");
        }
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

deu o erro abaixo :slight_smile:
java.io.FileNotFoundException: class path resource [doc/Presencas_Regatas_Abril_2016.xls] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/app/target/regatas-api-1.0.0-SNAPSHOT.jar!/BOOT-INF/classes!/doc/Presencas_Regatas_Abril_2016.xls

Tente apenas assim:

InputStream is =  this.getClass().getResourceAsStream("/doc/Presencas_Regatas_Abril_2016.xls")

deu certo, agora preciso, fazer isso :slight_smile:
File file11 = is.getFile();
mas esta dando erro.

Tente assim:

InputStream is = this.getClass().getResourceAsStream("/doc/Presencas_Regatas_Abril_2016.xls");
byte[] buff = new byte[is.available()];
is.read(buff);

File file11 = File.createTempFile("meuArquivo", "tmp");
OutputStream outStream = new FileOutputStream(file11);
outStream.write(buff);

Porque precisa do objeto File?
Um File representa um arquivo ou diretório no sistema de arquivos do sistema operacional.

Seu artefato não é um arquivo em disco, ele é parte do conteúdo do seu JAR.

Faça assim:

InputStream input = getClass().getResourceAsStream("/doc/Presencas_Regatas_Abril_2016.xls");
if (input != null) {
    System.out.println("existe o arquivo");
} else {
    System.out.println("não existe o arquivo");
}
1 curtida

Então minha ideia é o seguinte:

tenho arquivoTemplate.xls e todo mês , irá entrar na rotina e gerar um arquivo por exemplo chamado arquivo072019.xls e neste arquivo irá preencher algumas informações vindo do meu Banco de Dados.

Local Host, funciona de boa, mas no heroku, estou com essa dificuldade.

Preenchi este arquivo, o usuário irá fazer um download deste arquivo, que será enviado por e-mail, para a empresa.

Não enxerguei uma forma de fazer isso, se tiver uma sugetão serão muito bem vindo.