Gerar arquivo texto?

Qual a melhor maneira para gerar um arquivo texto através de uma String que contém várias linhas?
Eu fiz um método, utilizando o FileWriter() e PrintWriter(), mas eu tb poderia utilizar o BufferedWriter e FileWriter, correto?

Tamanini,

Correto, eu sempre utilizo as classes Buffered… nunca testei o desempenho para ver se realmente é melhor.

Porém as utilizo por acreditar ser mais rápido, mas não tenho certeza. Porém segue uma discusão sobre isso.

http://www.javafree.org/javabb/viewtopic.jbb?t=868939

Abs,

Bruno Tafarelo

Quando o arquivo que quer gerar é muito grande há vantagem em usar Buffered, caso contrário você não tem tanto ganho assim.

Boa pimenta,

Faz sentido pelo menos para mim.

Abs,

Bruno Tafarelo

bom, não sei ao certo o que pretende fazre mas usando a BufferedWriter você algo do tipo::


String conteudo; // já está com conteúdo

BufferedWriter b = new BufferedWriter(new FileWriter("saida.txt"));
b.write(conteudo);

com o PrintWriter vc econimiza algumas linhas, e essa class tem alguns metodos mais eficiente que as outras classes, é melhor usar println() que newline() por exemplo…

Bem, eu fiz assim(utilizando o PrintWriter):

[code]fw = new FileWriter(local);
pw = new PrintWriter(fw);
pw.println(conteudo);

fw.close();
pw.close();[/code]

Pelo que entendi, a diferença é que o BufferedWriter(), fica armazenando os dados na memória e depois que você terminar de escrever tudo, você grava no arquivo. Enquanto o PrintWriter(), fica sempre escrevendo direto no arquivo. Então o BufferedWriter talvez tenha um desempenho melhor, pois não fica a todo instante acessando o arquivo para reescrever, já que ele guarda tudo na memória até um certo limite e depois ele grava no arquivo. Mas essa vantagem é só quando tenho que escrever um arquivo muito grande.
Será que é isso?

[quote=LPJava]com o PrintWriter vc econimiza algumas linhas, e essa class tem alguns metodos mais eficiente que as outras classes, é melhor usar println() que newline() por exemplo…

[/quote]

Mas qual seria a economia? Pois com o BufferedWriter, só teria mais uma linha, que seria o método .flush, não é?
E por que é melhor utilizar o println() ao invés do newline()?

[code]fw = new FileWriter(local);
bw = new BufferedWriter(fw);
bw.write(conteudo);

bw.flush();
bw.close();
fw.close();[/code]

Alguém???

Sempre usei println, acredito que o newLine deve resolver problemas que algumas versões de SO não quebram a linha.

Então o newLine() deve quebrar a linha de forma para todos os SO reconhecerem.

Rodrigo,

Pelo que estou entendendo na sua dúvida, você não tem que se preocupar com econômia de código e sim com a econômia de processamento, já que nem sempre menos linhas significa menos processamento e outra o código deve ser além de eficiente, legível.

O fato de usar o flush, e só para ele esvaziar o Buffer. Mas se olhar no código do close:

  public void close() throws IOException {
	synchronized (lock) {
	    if (out == null)
		return;
	    flushBuffer();
	    out.close();
	    out = null;
	    cb = null;
	}
    }

Ele já faz o flush pra tu :wink:

Agora entre o newLine e Writeln, o newLine é para quebrar a linha para você e o Writeln vai escrever sua linha e depois quebra-lá. Bom não sei de onde é este método Writeln, mas o newLine é isso e oque eu costumo fazer é concatenar a quebra de linha no meu código sem chamar um método do Java para isso.

Abs,

Bruno Tafarelo

A grande real diferença é que o Buffered tende a ser mais rápido por bufferizar o que é escrito e executar o flush mandando tudo de uma vez. Se o buffer já estiver cheio ele faz o flush automaticamente. Você também pode habilitar o auto-flush passando true para um dos construtores da classe. Se não usar o Buffered tudo que for executando vai sendo escrito no arquivo e isso tende a ser mais lento.

Não sei exatamente que ganho de linhas é esse que o LPJava falou. Desconheço…

Quem vai traduzir para o SO é a JVM. Portanto utilizar o println() é viável em qualquer SO.

Abraços,

Se usar somente println() em alguns SO ele irá abrir tudo numa única linha, já passei por isso.

Outra questão se você usar o Buffer e for executar o flush só no final e o conteudo for grande, grande mesmo sua memória irá estourar, e deixar a aplicação bem lenta o flush deve ser executado de tempos em tempos.
Exatamente para ele dar uma descarregada da memória e jogar no arquivo.

Gostei das dicas.
Obrigado pessoal!