Escrever de forma contínua em um mesmo arquivo.txt

Pessoal, estou aprendendo sobre a classe file e no código que gerei meu programa grava sempre um arquivo por cima do outro, sendo que eu queria continuar escrevendo vários conteúdos, de acordo com o construtor, no mesmo arquivo.

Obs.: sei que o código não está errado como se tivesse um bug e tal, eu é que quero saber uma solução pra essa questão. :slight_smile:

Eu imagino que seja necessária uma leitura do arquivo antes ou algo do tipo utilizando o “.exists()” e o “.isFile()” para depois escrever nele, mas confesso que a parte da continuidade da escrita que não sei como codar :thinking:

Vou postar abaixo o código abaixo para vocês conferirem:

public static void main(String[] args) throws IOException {
	Scanner sc = new Scanner(System.in);
	String matricula, nome;
	double teste, prova;
	int faltas;
	
	FileWriter arq = new FileWriter("C:\\Users\\antruz\\Documentos\\texto.txt");
	PrintWriter gravarArq = new PrintWriter(arq);
	
	System.out.println("DIGITE SUA MATRICULA: ");
	matricula = sc.nextLine();
	
	System.out.println("DIGITE SEU NOME: ");
	nome = sc.nextLine();
	
	System.out.println("DIGITE SEU TESTE: ");
	teste=sc.nextDouble();
	
	System.out.println("DIGITE SUA PROVA: ");
	prova=sc.nextDouble();
	
	System.out.println("DIGITE SUAS FALTAS: ");
	faltas=sc.nextInt();
	
	gravarArq.println("MATRICULA: " + matricula);
	gravarArq.println("NOME: " + nome);
	gravarArq.println("NOTA DO TESTE: " + teste);
	gravarArq.println("NOTA DA PROVA: " + prova);
	gravarArq.println("TOTAL DE FALTAS: " + faltas);
	arq.close();

	System.out.println("ARQUIVO GRAVADO COM SUCESSO!");
}

}

A class FileWriter tem um construtor que recebe um parâmetro para indicar se pretendes ou não fazer append de um ficheiro existente.

2 curtidas

Dica: sempre consulte a documentação. No caso de FileWriter, aqui diz que vc pode usar um parâmetro para indicar se deve escrever a partir do final do arquivo.

Ou seja, bastaria trocar para:

FileWriter arq = new FileWriter("C:\\Users\\antruz\\Documentos\\texto.txt", true);
1 curtida

@pmlm e @hugokotsubo

Vou dar uma estudada na documentação na parte de construtores.

Obrigado pelas respostas!

Outra coisa, desde o Java 7 vc pode usar o try with resources, assim não precisa chamar close:

try(FileWriter arq = new FileWriter("C:\\Users\\antruz\\Documentos\\texto.txt", true)) {
    // escrever no arquivo 
} catch (IOException e) {
    // tratar erro, mostra mensagem, etc
}

Desta forma é garantido que o arquivo sempre será fechado, mesmo se der algum erro no meio do programa.

1 curtida

Para continuar escrevendo no mesmo arquivo sem sobrescrever o conteúdo existente, você pode usar o construtor do FileWriter que permite a adição de novos dados ao final do arquivo. Basta alterar a linha onde você instancia o FileWriter para:

FileWriter arq = new FileWriter("C:\\Users\\antruz\\Documentos\\texto.txt", true);

O segundo parâmetro true indica que você quer abrir o arquivo em modo de escrita, mas mantendo o conteúdo existente e escrevendo no final dele. Dessa forma, os novos dados serão adicionados ao final do arquivo, sem apagar o que já está escrito.

Além disso, é uma boa prática fechar o PrintWriter e o Scanner após o uso. Você pode fazer isso no final do seu código:

gravarArq.close();
sc.close();

Isso garantirá que os recursos sejam liberados corretamente.

Para garantir que os novos conteúdos sejam adicionados ao arquivo existente em vez de substituí-lo, você precisa abrir o arquivo em modo de adição. Isso pode ser feito adicionando um segundo parâmetro ao construtor FileWriter, configurando-o como true. Aqui está como você pode fazer isso:

FileWriter arq = new FileWriter("C:\\Users\\antruz\\Documentos\\texto.txt", true);

Isso permitirá que você adicione novos conteúdos ao final do arquivo existente em vez de substituí-lo. Com essa modificação, seu programa continuará a escrever novos conteúdos no mesmo arquivo sem sobrescrever o que já foi escrito.