Alterar dados em arquivo txt

6 respostas
Leandro_M

Olá
Gostaria de saber se alguém poderia me ajudar pois estou precisando de ajuda com meu projeto.
Dei início ao meu projeto pelo banco de dados e é justamente nele que estou há mais de 10 dias sem nenhuma evolução

significativa.
Como ainda sou leigo em Java resolvi iniciar meu projeto com a base de dados baseada em arquvo sequencial e

randômico. até então tudo esta funcionando: cadastro, consulta e alteração. a ALTERAÇÃO está me dando uma dor de

cabeça terrível porque não funciona do jeito que quero.

Em meu projeto há uma classe chamada Menu() a qual tem uma estrutura de repetição (while) para facilitar a escolha das

opções (cadastro, consulta e alteração) por parte do usuário.

Quando a opção 3 (Alterar) é escolhida, o método é chamado normalmente e efetua a alteração normalmente. Em seguida

o programa volta para o início devido sua estrutura de repetição. Apartir da segunda volta no while o método

AlteraMercadoria() começa a fazer um processo de alteração, porém acumulativo. De modo que na primeira volta do

while o registro escolhido para alteração é alterado (substituido) normalmente, porém nos seguintes o registro escolhido

para alteração TAMBÉM é alterado, mas o método grava no arquivo os resgistros já esxixtentes, ou seja, O NÚMERO DE

REGISTROS SÃO ELEVADOS AO QUADRADO.

Abaixo está um exemplo o qual eu alterei somente o ítem 1.
As alterações são feitas apenas nos ítens mercadoria, preço e quantidade.

REGISTROS EXISTENTE:
#1 ARROZ 10.00 2
#2 FRANGO 45.50 21

PRIMEIRA VOLTA (alteração)
#1 LEITE 5 4
#2 FRANGO 45.50 21

SEGUNDA VOLTA (sem o arquivo sofrer cadastros, somente alterações)
#1 SOJA 7 54
#2 FRANGO 45.50 21
#1 LEITE 5 4
#2 FRANGO 45.50 21

TERCEIRA VOLTA
#1 MILHO 33 2
#2 FRANGO 45.50 21
#1 LEITE 5 4
#2 FRANGO 45.50 21
#1 SOJA 7 54
#2 FRANGO 45.50 21
#1 LEITE 5 4
#2 FRANGO 45.50 21

while(escolhaInt != 0){
		try{
			System.out.println("[1] = Cadastro -- [2] = Consulta -- [3] = Alterar -- [0] = SAIR ");
			System.out.print("Escolha a opcao: ");
			String escolha = entrada.readLine();
			escolhaInt = Integer.parseInt(escolha);
			
			switch(escolhaInt){
				case 1: Cadastro.CadastroMercadoria();
				break;
				case 2: Consulta.ConsultaMercadoria();
				break;
				case 3: Alterar.AlteraMercadoria();
				break;
				case 0: System.out.println("::::  Saindo do Programa  ::::     TCHAU - VOLTE 

SEMPRE");
				break;
				default: System.out.println("Opcao incorreta!!!");
			}
		}catch (Exception erro){
			System.out.println("ESCOLHA UMA OPCAO ACIMA OU [0] PARA SAIR");
		}
	}

SEGUE A CLASSE RESPONSAVEL POR TUDO ISSO:
Acredito eu que o problema esteja no objeto memória. acredito que ela deve acumular os registros e elevá-los ao quadrado

a cada ciclo do while.
enquanto fazia os teste percebi uma coisa: A primeira alteração sempre é feita de forma exata e sem erros, porém as

seguintes não posso dizer o mesmo. Sempre dá esse erro.
tentei utilizar o método FINALIZE() para tentar destruir o método AlteraMercadoria() e ver se o objeto MEMORIA

retornaria vazio mas não deu em nada.

ESPERO QUE POSSA ME AJUDAR. SE NÃO COM ESSA DÚVIDA PELO MENOS ME MOSTRE UM CAMINHO MENOS

ÁRDUO OU ÁRDUO PORÉM EFICAZ.

QUAL BANCO DE DADOS VOCES ME ACONSELHAM A USAR?
VALEU PESSOAL. MUITO OBRIGADO!!!

Leandro M.

import java.io.*;  
class alteraVendaRandomico {
	static StringBuffer memoria = new StringBuffer();
	//int mostraMaisUmaVenda = 0;
	//String vendaSimNao;
	public void.AlteraMercadoria(){
	
	try{
		BufferedReader entrada;
		entrada = new BufferedReader (new InputStreamReader (System.in));
		BufferedReader arqentrada;
		arqentrada = new BufferedReader (new FileReader ("C:\Documents and 

Settings\Leandro\Desktop\CadMercadoria.txt"));
		String linha = "";
		
		while((linha = arqentrada.readLine()) != null){
			memoria.append (linha + "\n");
		}
		System.out.print("Digite o Codigo: ");
		String alteraCod_cli = entrada.readLine();
		int primeiro = -1;
		
		if (memoria.length() != 0){
			primeiro = memoria.indexOf ("#" + alteraCod_cli);
			
			if (primeiro != -1){
				int fim = memoria.indexOf("\t", primeiro);
				int Cod_cli = Integer.parseInt(ler (primeiro +=1, fim));
				primeiro = fim + 1;
				fim = memoria.indexOf("\t", primeiro);
				String Nome = ler (primeiro, fim);
				int inicio = fim + 1;
				fim = memoria.indexOf("\t", inicio);
				
				String Valor = ler (inicio, fim);
				inicio = fim + 1;
				fim = memoria.indexOf("\n", inicio);
				
				String Quantidade = ler (inicio, fim);
				
				System.out.println("NOME: " + Nome + "  VALOR: " + Valor + "  

QUANTIDADE: " + Quantidade);
				//System.out.println(primeiro + "  " + fim + "  " + inicio + "  " + memoria);
				
				regAgendaRadomico regAg1 = new regAgendaRadomico(Cod_cli, Nome, 

Valor, Quantidade);
				
				System.out.print("Nome: ");
				Nome = entrada.readLine();
				
				System.out.print("Valor: ");
				Valor = entrada.readLine();
				
				System.out.print("Quantidade: ");
				Quantidade = entrada.readLine();
				
				regAg1.alteraNome(Nome);
				regAg1.alteraQuant(Valor);
				regAg1.alteraEmail(Quantidade);
				
				memoria.replace(primeiro, fim, regAg1.mostraNome() + "\t" + 

regAg1.mostraQuant() + "\t" + regAg1.mostraEmail());
				gravar();
			}else{
				System.out.println("Codigo nao Encontrado");
			}
		}else{
			System.out.println("O arquivo esta vazio");
		}
		arqentrada.close();
		
	}catch(FileNotFoundException erro){
		System.out.println("O arquivo nao foi encontrado");
	}catch (Exception erro){
		System.out.println("Erro de leitura");
	}
	}

	public static String ler (int primeiro, int ultimo){
		String dados = "";
		char [] destino = new char [ultimo - primeiro];
		memoria.getChars (primeiro, ultimo, destino, 0);
		for (int i = 0; i< destino.length; i++){
			dados += destino[i];
		}
		return dados;
	}


public void gravar (){
		try{
			BufferedWriter saida;
			saida = new BufferedWriter (new FileWriter("C:\Documents and Settings\Leandro 

Marques\Desktop\Restaurante\CadMercadoria.txt"));
			saida.write(memoria.toString());
			saida.flush();
			saida.close();
			
		}catch(Exception erro){
			System.out.println("Erro de gravacao");
		}
		}
		}

6 Respostas

Leandro_M

Alguém ajuda por favor!!! :slight_smile: :smiley:

Leandro_M

mensagem criada apenas para tentar corrigir o título anterior.

samuelhenriquerj

Dá uma olhada nesse topico aqui: http://www.guj.com.br/java.tutorial.artigo.183.1.guj

evandroshx

Leandro,

seu código tem alguns pontos confusos. Por exemplo: na chamada do seu método para alteração…

case 3: Alterar.AlteraMercadoria();

vc usa a classe Alterar enquanto que o nome da sua classe é alterarVendaRandomico ? Estranho este seu código estar funcionando.

Ah, uma dica, use nome de classes com a primeira letra em maiúscula sempre.

Outro detalhe é que no seu método AlterarMercadoria() vc sempre faz um new BufferedReader para ler o seu arquivo…

arqentrada = new BufferedReader (new FileReader ("C:\Documents and Settings\Leandro\Desktop\CadMercadoria.txt"));

…se vc sempre lê o seu arquivo então não use a sua variável memória como “static” e inicialize ela dentro do seu método AlterarMercadoria().

public void.AlteraMercadoria(){
 	
 	     try{
                   memoria = new StringBuffer();
                   BufferedReader entrada;
                   ...
        }

corrija estes problemas e veja se funciona. Pelo que vi no seu código o seu problema pode estar justamente no uso da sua variável memória como uma variável global e estática, dessa forma, vc nunca está alterando o valor dela e sim sempre irá incluir novos valores.

flw.

Leandro_M

evandroshx ,

AQUI ESTÃO DOIS CÓDIGOS, DESSA VEZ MAIS COMPLETOS. DESCULPA A DESORDEM DO ANTERIOR.

código I
class RegAgenda {
	
	private int cod_clin;
	private String nome;
	private String Quant;
	private String Email;
	
	public RegAgenda(int cod, String nom, String quant, String email){
		Cod_clin = cod;
		Nome = nom;
		Quant = quant;
		Email = email;
	}
	
	public int mostraCod(){
		return Cod_clin;
	}
	
	public String mostraNome(){
		return Nome;
	}
	
	public String mostraQuant(){
		return Quant;
	}
	
	public String mostraEmail(){
		return Email;
	}
	
	public void alteraEmail(String novoEmail){
		Email = novoEmail;
	}
	
	public void alteraNome(String novoNome){
		nome = novoNome;
	}
	
	public void alteraQuant(String novaQuant){
		Quant = novaQuant;
	}

}
código II
import java.io.*; 
class AlteraVenda {
	
	public static StringBuffer memoria = new StringBuffer();

	public void Alteracao(){
		
	try{
		BufferedReader entrada;
		entrada = new BufferedReader (new InputStreamReader (System.in));
		BufferedReader arqentrada;
		arqentrada = new BufferedReader (new FileReader ("C:\Documents and Settings\Leandro\Desktop\CadMercadoria.txt"));
		String linha = "";
		
		while((linha = arqentrada.readLine()) != null){
			memoria.append (linha + "\n");
		}
		
		System.out.print("Digite o Codigo: ");
		String alteraCod_cli = entrada.readLine();
		int primeiro = -1;
		
		if (memoria.length() != 0){
			primeiro = memoria.indexOf ("#" + alteraCod_cli);
			
			if (primeiro != -1){
				int fim = memoria.indexOf("\t", primeiro);
				int Cod_cli = Integer.parseInt(Ler (primeiro +=1, fim));
				primeiro = fim + 1;
				fim = memoria.indexOf("\t", primeiro);
				
				String Nome = Ler (primeiro, fim);
				int inicio = fim + 1;
				fim = memoria.indexOf("\t", inicio);
				
				String Valor = Ler (inicio, fim);
				inicio = fim + 1;
				fim = memoria.indexOf("\n", inicio);
				
				String Quantidade = Ler (inicio, fim);
				
				System.out.println("NOME: " + Nome + "  VALOR: " + Valor + "  QUANTIDADE: " + Quantidade);
				
				RegAgenda regAg1 = new regAgendaRadomico(Cod_cli, Nome, Valor, Quantidade); 
[i][b]//CONSTRUTOR. RETORNA OS VALORES ENCONTRADOS NO ARQUIVO E OS DISPONIBILIZA PARA ALTERAÇÃO
				
				//DADOS A SEREM ALTERADOS		[/b][/i]				System.out.print("Nome: ");
				Nome = entrada.readLine();
				
				System.out.print("Valor: ");
				Valor = entrada.readLine();
				
				System.out.print("Quantidade: ");
				Quantidade = entrada.readLine();
				
				regAg1.alteraNome(Nome);
				regAg1.alteraQuant(Valor);
				regAg1.alteraEmail(Quantidade);
				
	[i][b]//O PROBLEMA ESTÁ AQUI (ACREDITO EU).[/b][/i]	memoria.replace(primeiro, fim, regAg1.mostraNome() + "\t" + regAg1.mostraQuant() + "\t" + regAg1.mostraEmail());
				gravar();
				
			}else{
				System.out.println("Codigo nao Encontrado");
			}
		}else{
			System.out.println("O arquivo esta vazio");
		}
		arqentrada.close();
	
	}catch(FileNotFoundException erro){
		System.out.println("O arquivo nao foi encontrado");
	}catch (Exception erro){
		System.out.println("Erro de leitura");
	}
}

	public static String Ler (int primeiro, int ultimo){
		String dados = "";
		char [] destino = new char [ultimo - primeiro];
		memoria.getChars (primeiro, ultimo, destino, 0);
		for (int i = 0; i< destino.length; i++){
			dados += destino[i];
		}
		return dados;
	}


		public void gravar (){
		try{
			BufferedWriter saida;
			saida = new BufferedWriter (new FileWriter("C:\Documents and Settings\Leandro\Desktop\CadMercadoria.txt"));
			saida.write(memoria.toString());
			saida.flush();
			saida.close();
			
		}catch(Exception erro){
			System.out.println("Erro de gravacao");
		}
	}
}

ho evandroshx, eu fiz o que vc pediu mas deu uma série de erros.
Acredito que seja porque a variável memoria é reverenciada nos 3 métodos.

TENTA FAZER UM TESTE. FAZ O ARQUIVO E COLOCA APENAS ESSES
DOIS REGISTROS E TENTA ALTERA-LOS. VC VAI VER QUE SEM O WHILE
ELE ALTERA SEM PROBLEMA. DEPOIS VC TENTA IMPLEMENTAR UM WHILE NO CÓDIGO.

#1 ARROZ 1 1
#2 CARNE 42 22

Pelo que percebi o variável MEMORIA é quem faz toda essa bagunça. Não
sei mais o que faço com ele, não tenho mais idéia. já tentei anular seus
valores e nada. Por exemplo: mamoria = null ou memoria.equals(null).
Na primeira o código acusa erro de leitura e na segunda não acontece
absolutamente nada.

utilizando o arquivo com a estruta de repetição eu percebi percebi
também que se o arquivo estiver aberto ele faz
quantas alterações for necessárias com a estrutura de repetição, só que
ele altera na memoria e na variável MEMORIA, pois o arquivo só é escrito após ser fechado. E então,
quando dou o comando de fechar o aruqivo, ele grava a alteração, depois o arquivo reaberto para novas alterações e aí acontece tudo de novo,
mais inclusões duplicadas.
Realmente meu código estava meio confuso: com relação ao endereço:

saida = new BufferedWriter (new FileWriter("C:\\Documents and Settings\\Leandro\\Desktop\\CadMercadoria.txt"));

eu alterei apenas em um e esqueci de alterar no outro.

Nos teste que fiz acontece o seguinte: quando eu executo o código do
jeito que está, ele roda normalmente, faz as alterações e se fecha. Desse
jeito eu faço várias alterações. Acredito que porque o variável MEMORIA
é apagado da memória e fica sem nenhum valor adicional (ou acumulado).
Já quando eu coloco uma estrutura de repetição (while) ele dá esse
problema de duplicar os registros a cada tentativa de alteração que é feita.

valeu pela ajuda por enquanto.

um abraço

Leandro M.

Leandro_M

** alterei a classe na hora e esqueci desse detalhe

class RegAgenda {
 	
 	private int Cod_clin;
 	private String Nome;
 	private String Quant;
 	private String Email;
 	
 	public RegAgenda(int cod, String nom, String quant, String email){
 		Cod_clin = cod;
 		Nome = nom;
 		Quant = quant;
 		Email = email;
 	}
Criado 27 de julho de 2007
Ultima resposta 27 de jul. de 2007
Respostas 6
Participantes 3