Gerar arquivo texto?

13 respostas
T

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?

13 Respostas

B

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

pimenta

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

B

Boa pimenta,

Faz sentido pelo menos para mim.

Abs,

Bruno Tafarelo

T

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);
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…

T

Bem, eu fiz assim(utilizando o PrintWriter):

fw = new FileWriter(local);
pw = new PrintWriter(fw);
pw.println(conteudo);
			
fw.close();
pw.close();

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?

T
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...

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()?

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

bw.flush();               
bw.close();
fw.close();
T

Alguém???

java.rco

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.

B

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

pimenta

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,

java.rco

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.

T

Gostei das dicas.
Obrigado pessoal!

Criado 26 de junho de 2008
Ultima resposta 27 de jun. de 2008
Respostas 13
Participantes 6