Erro ao ler e salvar arquivos txt - Java WEB

E ae galera,

Sou iniciante no java e estou com um problema!

Estou desenvolvendo um sistema web para recomendação de cursos.

Tenho uma função que lê o nome de todos os arquivos de um diretório e me retorna uma lista com esses nomes.

Estou utilizando a classe file do java para fazer essa leitura.

A função é a seguinte:

    public List<String> LerDiretorios() {

	List<String> diretorios = new ArrayList<String>();

	try {
		File file = new File("./arquivo/Cursos");
		File arquivo[] = file.listFiles();
		int i = 0;
		for (int j = arquivo.length; i < j; i++) {
			String arq = arquivo[i].getName();
			diretorios.add(arq);
		}
	} catch (Exception e) {
		// TODO: handle exception
		System.out.println("Erro ao ler diretorio: " + e);
	}

	return (diretorios);
}

Essa função funciona se eu executa-la no como uma aplicação java, me trazendo o nome de todos os arquivos do diretório especificado.

O problema é, quando eu rodo essa função em um servidor tomcat, essa linha : File arquivo[] = file.listFiles(); me retorna null, ou seja, ela nao conseguiu ler os arquivos na pasta.

A mensagem de erro é: Erro ao ler diretorio: java.lang.NullPointerException

Não sei se é alguma configuração ou algum erro meu que está fazendo essa função não rodar no projeto web.

Segue a estrutura de pastas que eu utilizo

Desde já Agradeço a todos!

Experimente colocar os arquivos dentro pasta WebContent.

Obrigado Helciodasilva, mas continua com o erro: java.lang.NullPointerException

Na string do caminho do arquivo vc tem que escapar as barras da url, tente assim;
File file = new File(".//arquivo//Cursos"

O segredo está no ponto na frente do caminho, do jeito que marcou, não importa qual diretório você coloque o arquivo/pasta, está informando que está no mesmo diretório da classe que está chamando.

Resumindo…

File file = new File("arquivo/Cursos"); // mesmo diretório da classe
File file = new File("./arquivo/Cursos"); // mesmo diretório da classe
File file = new File("../arquivo/Cursos"); // um diretório acima da classe
File file = new File("/arquivo/Cursos"); // pasta raiz da aplicação (WebContent)

E caso esses diretórios não possam ser visíveis/públicos (acessados via navegador), você deve colocá-lo em WEB-INF assim:

File file = new File("/WEB-INF/arquivo/Cursos");

@Reinaldofox não há necessidade quando se usa barra, apenas quando em ambientes windows devido a contra barra:

File file = new File("\\arquivo\\Cursos");
1 curtida

LostSoldier, msm colocando os arquivos dentro de WEB-INF, continua dando erro. Será que não é nenhuma configuração errada no projeto?

Exceptions? Como você está declarando a string no File?

Achei uma forma que funcionou

Coloquei a pasta arquivo no C: e o caminho para essa pasta.

File file = new File(“C:\arquivo/Cursos”);

Mas creio que não seja o ideal.

LostSoldier, não entendi muito bem sua pergunta.

Estou passando a string com o caminho pelo construtor da classe file.

Me referia a forma como você declara a string no construtor de file, se com ponto, sem ponto, etc…

Realmente essa forma não é ideal, principalmente por deixar um caminho fixo, no caso C:…, se trocar sua aplicação para linux por exemplo, você terá de mudar sua servlet…

Pesquise sobre realpath em servlets para ver como pode pegar o caminho absoluto…

2 curtidas

LostSoldier, utilizando o realpath consegui pegar o caminho direitinho.

Muito Obrigado a todos que me ajudaram

Poderia postar o trecho de código? Outras pessoas podem ter a mesma dúvida e compartilhar seria interessante…

1 curtida

Usei esse trecho de código dentro do servlet para pegar o caminho relativo, até a pasta WEB-INF, depois só tive que passar o caminho como parametro para a função e concatenei com o caminho do arquivo txt que eu precisava.

ServletContext context = request.getServletContext();
String caminho = context.getRealPath("/WEB-INF");

Muito obrigado pelo apoio

1 curtida