BufferedWriter

Porquê nao esta gravando no arquivo?

[code]package teste;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class Files {

public static void main(String[] args) throws IOException {
	
	File file = new File("C:\Documents and Settings\marcelo\Desktop\TestandoWriters.txt");
	
	if(!file.exists()){
		file.createNewFile();
		System.out.println("Arquivo criado com sucesso");
	}else{
		System.out.println("Arquivo ja existe");
	}
	
	
	FileWriter fw = new FileWriter(file, true);
	PrintWriter pw = new PrintWriter(fw);
	BufferedWriter bw = new BufferedWriter(pw);
	
	int i = 0;
	
	while(i < 20){
		
		bw.write("Marcelo"); // era pra gravar
		bw.newLine(); // passar para proxima linha do arquivo
		i++;
	}
}

}[/code]

1 curtida

Feche o arquivo (use o método “close”) antes de sair do programa.

[code]package teste;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class Files {

public static void main(String[] args) throws IOException {
	
	File file = new File("C:\Documents and Settings\everton\Desktop\TestandoWriters.txt");
	
	if(!file.exists()){
		file.createNewFile();
		System.out.println("Arquivo criado com sucesso");
	}else{
		System.out.println("Arquivo ja existe");
	}
	
	
	FileWriter fw = new FileWriter(file, true);
	PrintWriter pw = new PrintWriter(fw);
	BufferedWriter bw = new BufferedWriter(pw);

	fw.close();
	
	int i = 0;
	
	while(i < 20){
		
		bw.write("Marcelo");
		bw.newLine();
		i++;
	}
	
	//bw.flush();
	bw.close();
	
}

}[/code]

Mesmo assim nao funciona, agora estranho que quando tento escrever no arquivo sem o while, ou seja so uma vez funciona.

É porque você fechou o arquivo antes de escrevê-lo (ao usar fw.close). O jeito recomendado de usar arquivos é criar apenas uma varíavel, não 3, 4 ou 5, para cada arquivo. Faça assim:

         PrintWriter pw = new PrintWriter (new BufferedWriter (new FileWriter (file, true)));
         int i = 0;  
           
         while(i < 20){  
               
             pw.println("Marcelo");  
             i++;  
         }  
         pw.close(); // Isto fecha o pw, que fecha o BufferedWriter, que fecha o FileWriter, que grava tudo em arquivo.

Prontinho, muito mais claro, fácil e funcional. Deixe sempre o PrintWriter como o mais “externo”, já que ele tem os métodos práticos “println” e “printf”,

Colega

Tire fw.close(); que funciona pq vc usa ela pra criar o PrintWriter .

Melhor ainda é usar o PrintWriter sem BufferedWriter pq ele escreve a String no arquivo e já gera a quebra de linha que vc faz c/ bw.write("Marcelo"); bw.newLine();

Assim p/ gravar cada linha :

[code]while(i < 20){

		pw.println("Marcelo");  
		i++;  
	}  [/code]

Luiz Renato

Obrigado Entanglement e Luiz. Agora qual o problema de não usar o close()? Porque nao grava?

Outra coisa deixando o PrintWriter encapsulando tudo, para quebrar as linhas vou ter que usar “\n” mesmo né?!

1 curtida

Pois é. Um arquivo, em Java, é algo que não é escrito imediatamente no disco; normalmente é gravado de 8 em 8 kbytes se você usar um BufferedWriter. Isso é feito para tornar seu programa mais rápido, porque cada escrita em disco leva tempo, mesmo que seja para escrever 1 byte somente.
Isso quer dizer que se você sair de seu programa sem usar “close”, provavelmente os últimos 8 kbytes do seu arquivo, se não até mais, não serão gravados adequadamente.

1 curtida

[quote=Dota]Obrigado Entanglement e Luiz. Agora qual o problema de não usar o close()? Porque nao grava?

Outra coisa deixando o PrintWriter encapsulando tudo, para quebrar as linhas vou ter que usar “\n” mesmo né?![/quote]

Não, o println (como mostrei no exemplo) quebra as linhas para você.

Se for usar printf, o quebrador de linhas é o formato especial “%n”.

[quote=entanglement][quote=Dota]Obrigado Entanglement e Luiz. Agora qual o problema de não usar o close()? Porque nao grava?

Outra coisa deixando o PrintWriter encapsulando tudo, para quebrar as linhas vou ter que usar “\n” mesmo né?![/quote]

Não, o println (como mostrei no exemplo) quebra as linhas para você.

Se for usar printf, o quebrador de linhas é o formato especial “%n”. [/quote]

Vlww cara!!!

Antes de dar o close() é bom também chamar o flush().

E não, o close() não faz isso automaticamente. Nenhum stream() tem essa obrigação e eu mesmo já tive problemas assumindo erroneamente isso.

Sou iniciante em java alguém ai dá uma força salvar o que é digitado nesse classe main, em um aquivo txt.

public class Main {

public static void main(String[] args) {

	Scanner scanner = new Scanner(System.in);
    while (true) {
        System.out.println("\nMenu Options\n");
        System.out.println("(1) - Adicionar Pessoa");
        System.out.println("(2) - Listar");
        System.out.println("(3) - Busca Por CPF");
        System.out.println("(4) - Busca Por Nome");
        System.out.println("(5) - Remover");

        System.out.print("Please enter your selection:\t");
        int op = scanner.nextInt();

        if (op == 1) {
        	Adicionar adicionar = new Adicionar();
        	UsuarioView.recebeDado("Nome: ");
        	UsuarioView.recebeDado("Sobrenome: ");
        	UsuarioView.recebeDado("CPF: ");
        	Long.parseLong(UsuarioView.recebeDado("Idade:"));
            Interface operacao  = new Adicionar();
            UsuarioView.exibeMsg(operacao.Operacao());
            
        }
        else if (op == 2) {
        	Interface operacao = new Listar();
        	UsuarioView.exibeMsg(operacao.Operacao());
            break;
        }
        else if(op == 3){
        Interface operacao = new BuscarPorCpf();
        UsuarioView.exibeMsg(operacao.Operacao());
        }
      }
}

}

public class Adicionar extends Pessoa implements Interface{

@Override
public String Operacao() {
	
  File arquivoEscrever = new File("F:\\Clientes.txt");

		try{
			int i = 0;
			if(!arquivoEscrever.exists()){
			arquivoEscrever.createNewFile();
			BufferedWriter writer = new BufferedWriter(new FileWriter(arquivoEscrever));
			writer.write( /* TEXTO DIGITADO NO USUARIO VIEW */ );

		    writer.newLine();
		    i++;
        } 
			}catch (IOException e) {
            e.printStackTrace();
        }

	return null;

}
}