Buffer na geração de arquivo

3 respostas
J

gente,

tenho uma lista de objetos, ai gero um arquivo a partir dela. Quando vou em outra lista e peço pra gerar o arquivo de novo... aparece os objetos da antiga :( aff... já limpei praticamente tudo... e não acho o problema. Segue o cod:
InputStream is  = getClass().getClassLoader().getResourceAsStream("geraArq/gerado.txt");            
            
            if(is!=null){
             byte[] b = inputStreamToBytes(is);       
            
		ServletOutputStream out = response.getOutputStream(); 		                	
		              		                	 
		response.reset(); 
		response.setHeader("Content-Disposition", "attachment;filename=lista.txt");
		response.setContentType("Application/txt");
		response.setContentLength(b.length);
		              
                
		out.write(b); 
		out.flush(); 
		out.close();	
                b = null;
                to_file.delete();
                response.flushBuffer();
                is.reset();
                is.close();
                form = null;

3 Respostas

ViniGodoy

Certifique de que:

  1. Você está lendo o mesmo arquivo que está gravando;
  2. As classes usam o mesmo classloader;
  3. Seu arquivo não é read-only.

Uma maneira relativamente fácil de se fazer isso é imprimir a URL do getResource() para ver se imprimem a mesma coisa.

J

Olá ViniGodoy,

1- O arquivo eu apago, logo após gerá-lo.
2- Como assim as classes usam o mesmo ClassLoader?
3-Toda vez que ele pega a lista ele gera um novo arquivo… na hora de fazer o download ele só gera certo se for a primeira vez do cara… Na segunda tentativa de gerar… não funciona, só gera o antigo.

Como faria pra imprimir o getResource?

Obrigado

ViniGodoy

Pode ser realmente algum cache em seu servidor, ou algo ainda mais nebuloso. Talvez alguém que conheça mais de web do que eu (e isso não é muito difícil de se achar) possa ter alguma sacada melhor.

Mas, explicando:

Alguns servidores trabalham com mais de um class loader. O classloader é a classe responsável por manter a lista de quais classes estão disponíveis para uso (quer dizer, em quais classes você pode ou não dar um new). É ele que, por exemplo, carrega um arquivo .jar e torna as classes dentro dele disponíveis.

Se você estiver com dois classloaders, com endereços relativos diferentes, o seu getResourceAsStream poderá estar retornando textos diferentes. Acho pouco provável, pois você deveria ter o mesmo arquivo nos dois endereços, mas esse é o tipo de erro que dá muita dor de cabeça as vezes.

Para imprimir o caminho gerado, para dar um System.out.println ou equivalente no que retorna a partir do getResourceAsStream.

Criado 2 de dezembro de 2007
Ultima resposta 3 de dez. de 2007
Respostas 3
Participantes 2