Adicionar informação em arquivo texto que ja possui informação sem apagar o que existe no mesmo


package br.com.farzacsystem;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.List;


  
public class Arquivo {  
    /** 
     * Realiza criação do arquivo CVS 
     *  
     * @param caminhoArquivo 
     * @throws IOException 
     */  
    private void createArquivo(String caminhoArquivo) throws IOException{  
        File f = new File(caminhoArquivo);  
        if (!f.exists()){  
            f.createNewFile();  
        }  
    }  
    
    
    /** 
     * Realiza a escrita dos valores no arquivo TXT 
     *  
     * @param caminhoArquivo - path do arquivo 
     * @param resposta - lista de valores a serem escritos 
     * @throws IOException 
     */  
    public void escreverArquivo(String file, List<List<String>> resposta) throws IOException{
        this.createArquivo(file);  
          
        File arquivo = new File(file);  
        PrintWriter pw = new PrintWriter(arquivo);  
        
        for(List<String> linha: resposta) {
			for(String elemento : linha) {
	}
			
	 pw.println(linha);
 }
        
        
        pw.flush();  
        pw.close();  
    }  
   

Como faço para antes de chamar este metodo novamente ele conseguir entender que a informação deve ser gravada no final do arquivo

Detalhes: A informação que estou gravando é uma lista de String

Espero que alguem possa me ajudar.

pw.append("teu texto aqui");

Você também pode modificar seu método de escrita de Arquivo da seguinte forma:

[code]public void escreverArquivo(String file, List<List> resposta, anexar boolean) throws IOException{
this.createArquivo(file);

    File arquivo = new File(file);  
    FileOutputStream output = new FileOutputstream(arquivo, anexar);//Se a variável anexar for verdadeira, a stream adicionará o conetúdo no final do arquivo; caso for falsa, o mesmo será sobrescrito
    BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(output));

    
    for(List<String> linha: resposta) {
	for(String elemento : linha) {
                   bufferedWriter.write(linha);
       }
    }
    file.close();
    output.close();
    bufferedWriter.close();

}
[/code]

Com isso, você tem um método em que você pode optar por anexar o texto no fim do arquivo ou não.

Boa noite matheuslmota

O porblema 'e que linha 'e uma lista de da erro passar lista no bufferedWriter.write(linha);

At’e agora so consegui gravar linha com

PrintWriter pw = new PrintWriter(f);
pw.println(linha);

Porem utilizando PrintWriter nao consigo verificar se o arquivo ja possui informaçao para efetuar a gravaçao no final do arquivo.

Com printwriter, consigo verificar se o arquivo possui informaçao para adicionar o conetúdo no final do arquivo; caso for falsa, o mesmo será sobrescrito ou posso utilizar outro metodo que grava arquivo texto partir de informaçoes de lista ?

Fiz outra pequena modificação no método:

[code]public void escreverArquivo(String file, List<List> resposta)
throws IOException {
boolean anexar = false;
File f = new File(file);
if (f.length() != 0L)
anexar = true;
FileWriter writer = new FileWriter(new File(file), anexar);
BufferedWriter bufferedWriter = new BufferedWriter(writer);

	for (List<String> linha : resposta) {
		for (String elemento : linha) {
			bufferedWriter.write(elemento);
		}
	}
	writer.close();
	bufferedWriter.close();
}[/code]

Perceba que eu crio uma instância de File e com o método length eu verifico se o mesmo possui algum conteúdo (length retorna o número de bytes do arquivo descrito pelo path ou 0L se o arquivo não existir). FileWriter recebe o objeto file e um boolean para dizer se o arquivo deve ou não ser anexado.

Boa tarde matheuslmota

Muito obrigado mesmo, deu certo.

Apenas uma observação, precisei colocar bufferedWriter.flush(); antes do writer.close();

Valeu mesmo matheuslmota …

[quote=farzac]Boa tarde matheuslmota

Muito obrigado mesmo, deu certo.

Apenas uma observação, precisei colocar bufferedWriter.flush(); antes do writer.close();

Valeu mesmo matheuslmota …[/quote]

Hum, tinha esquecido do flush. Por nada, precisando dá um grito ae.

Boa tarde matheuslmota

A geração do arquivo .csv deu certo.

Agora estou tendo dificuldade em abri-lo atraves do browser.

Alem das duas configuração abaixo, ha alguma outra configuração que preciso setar para abrir o arquivo.csv por um browser?

response.setContentType(“text/csv”);
response.sendRedirect(“arquivo.csv”);

No lugar de

response.sendRedirect("arquivo.csv")

Tenta

response.setHeader("Content-Disposition", "attachment; filename=arquivo.csv");

Abs.

Bom dia matheuslmota

Nao esta dando certo, ao inves de abrir a pagina mostrando as informaçoes do arquivo, esta apenas dando a opcao de abrir o arquivo , mas nao esta sendo aberto automaticamente pela pagina.

Segue a implementacao abaixo:

[code]
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	ArquivoCVS arquivoCVS = new ArquivoCVS();
	
	List<List<String>> linha = new ArrayList<List<String>>();
	List<String> coluna = new ArrayList<String>();				
	for(int i=0; i<2; i++){
		coluna.add("teste");
	}
	linha.add(coluna);
	
	arquivoCVS.escreverArquivo("consultas.csv", linha);
	
	response.setContentType( "text/html" ); 
	response.setHeader("Content-Disposition", "attachment; filename=consultas.csv");  
}[/code]

Cara, achei esse link: http://stackoverflow.com/questions/899858/returning-csv-file-from-servlet-using-servletoutputstream-over-https-in-internet. Ele faz mais ou menos o que tu quer fazer. Basicamente você deve ler o arquivo em um buffer de bytes e jogar o conteúdo desse buffer no outputStream do objeto response. Use bufferedOutputStream (conforme consta no link) para escrever no outputStream do response e tome cuidado com problemas de enconcoding.

Ola matheuslmota

Eu havia encontrado um exemplo igual ao que voce sugeriu, porem as informaçoes sao abertas num bloco de notas e nao no browser.

Fiz um esboço do código, não cheguei a testar, fiz de cabeça:

[code]
try
{BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(pathArquivo), Charset.forName(“ISO-8859-1”)));//Caso o arquivo csv tenha outro encoding, coloque-o no lugar do encoding que eu passsei.
BufferedWriter bufferedWriter = new BufferedWriter(response.getOuputStream());

String Line;

while((Line = reader.readLine()) != null)
{
bufferedWriter.write(Linha);
}
}catch(IOException e)
{e.printStrackTrace();}
finally{
reader.close();
bufferedWriter.close();
}[/code]

É mais ou menos isso.

Lembre-se apenas de mudar o contentType para text/csv

Ola matheuslmota

No navegador firefox ja consegui, porem no navegador chrome e IE nao esta dando certo.

No navegador firefox antes de abrir o arquivo ‘e mostrado uma caixa de mensagem solicitando se desejo salvar o arquivo ou abrir e com que tipo de programa quero abrir o arquivo que no meu caso e’ o Excel.

No navegador Chrome e IE o arquivo 'e aberto automaticamente pelo browser sem solicitar com qual software o arquivo sera aberto ou se sera salvo.

Sera alguma configuracao que preciso fazer no navegador?

Segue o codigo abaixo:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		ArquivoCVS arquivoCVS = new ArquivoCVS();
		
		List<List<String>> linha = new ArrayList<List<String>>();
		List<String> coluna = new ArrayList<String>();				
		for(int i=0; i<2; i++){
			coluna.add("teste");
		}
		linha.add(coluna);
		
		arquivoCVS.escreverArquivo("/home/farzac/Server/glassfish3/glassfish/domains/domain1/applications/ProjArquivoTexto/cons_config_exec.csv", linha);
		response.sendRedirect("/ProjArquivoTexto/cons_config_exec.csv");
		
	}

Agora eu não entendi. Você quer visualizar o arquivo csv ou abrir ele? Outra coisa, isso tá me cheirando a configuração do navegador.

Eu quero abrir o arquivo gerado, porem quero ter opção de escolher com qual programa irei abrir o arquivo csv gerado.

No IE ja esta mostrando a informação na pagina do browser porem queria abrir numa planilha excel e o IE nao mostra uma caixa com opção de abrir, salvar ou cancelar e é esta caixa de informação que preciso.

Apartir do momento que é disparado o response.sendRedirect("/ProjArquivoTexto/cons_config_exec.csv"), as informações são exibidas no browser do IE e uma caixa com as opções Abrir, Salvar e Cancelar deveria ser exibida.

Cara, faz assim:

response.setHeader("application/octet-stream");

Na verdade seria:

response.setHeader("application/csv");