Gerador de formulário imprime todos os formulário na tela, mas não salva todos no arquivo texto

Tenho o seguinte código que grava informação em um arquivo.txt:

    Formulario formulario = new Formulario();
		File file = new File("Comodatos.txt");
		if (file.exists()) {
			file.delete();
			file.createNewFile();
		}
		Writer fWriter = new PrintWriter(file);
		for (Clientes linha : table) {
			formulario.formularioCliente(linha, fWriter);
		}

Método formulacioCliente:

    public class Formulario {
public void formularioCliente(Clientes linhaTable, Writer writer) throws IOException {
	BuscaComodato buscacomodato = new BuscaComodato();
	writer.write("Cód: " + linhaTable.getCod()+" Zona: "+linhaTable.getZona()+"\n");
	writer.write("Razão Social: " + linhaTable.getRazaoSocial() + " Fantasia: " + linhaTable.getFantasia()+"\n");
	writer.write("Endereço: " + linhaTable.getEndereco() + " Geopolítico: " + linhaTable.getGeopolitico()+"\n");
	buscacomodato.buscacomodato(linhaTable.getCod(), writer);
	writer.write(" "+"\n");
	writer.write("######################################################"+"\n");
	writer.write(" "+"\n");

}

Método buscacomodato:

    public class BuscaComodato {
public void buscacomodato(String cod, Writer writer) {
	try {
		Tables table = new Tables();
		table.tables("clientes");
		Iterator<String> iterator = table.comodatos.keySet().iterator();
		while (iterator.hasNext() == true) {
			String iNext = iterator.next();
			if (table.comodatos.get(iNext).getCod().equalsIgnoreCase(cod)) {
				writer.write("Documento: " + table.comodatos.get(iNext).getDocumento() + " (Cód) Descrição: ("
						+ table.comodatos.get(iNext).getCodproduto() + ") "
						+ table.comodatos.get(iNext).getDescricao() + " Qtd no Comodato: "
						+ table.comodatos.get(iNext).getQtd() + "\n");
			}
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
}

}

Dúvida: O total de blocos como esse a serem gerados é de 277. Ao usar o SOUT para verificar se eles estão sendo gerados, dá os 277 registros, mas ao consultar o arquivo gerado, aparece bem uns 10 a menos… Alguem pode me ajudar a descobrir o porquê de nem todas as informações estarem indo?? um arquivo.txt pode ter até 5gb e esse nao da nem 1mb rsrs, não pode ser limite de espaço.

Resolvido, faltava o fWriter.close(). De acordo com o que li no fórum, os comandos writer, leêm em média 8kbytes de arquivo por vez e caso o comando close não seja utilizado, os últimos kbytes de informação são perdidos e acabam não sendo gravados. Valeu GUJ!

Chama o flush() antes do close() pra garantir que todo o buffer de bytes seja gravado.

	Writer fWriter = new PrintWriter(file);
	for (Clientes linha : table) {
		formulario.formularioCliente(linha, fWriter);
	}
	fWriter.flush();
	fWriter.close();

Dica: Sugiro utilizar nomes de classes, métodos e variáveis coerentes com o que representam e operação que realizam, fica bem mais legível. :wink:

Obrigado @staroski ! Aproveitando o embalo, sabe me dizer entre PrintWriter, BufferedWriter e FileWriter, qual o que funciona melhor e mais rápido? sei que o BufferedWriter só funciona através de variavel de referencia Writer.

O que você entende por “o que funciona melhor”?

Todas elas servem para escrever em um OutputStream.
PrintWriter é um Writer que te fornece os métodos print e println.
BufferedWriter é um Writer que utiliza um buffer em memória para ser mais rápido.
FileWriter é um Writer que você obtém a partir de um File.

Perfeito. Seria o que grava mais rápido. No meu código, deixei assim: PrintWriter fWriter = new PrintWriter(new BufferedWriter(new FileWriter(file)));
Obrigado staroski!

1 curtida