Classe para ArrayList ou Classe direto pro TXT?

Boa noite galera, então, eu to com um exercicio no curso que o professor pediu o seguinte

1. Faça um programa de caixa de supermercado. O programa deverá realizar as vendas de produtos.

Os produtos deverão estar pré-cadastrados, em um arquivo chamado BDProdutos.txt.

Após finalizar o registro dos itens dos produtos, realize o registro de pagamento. Salve o valor de todos os pagamentos no arquivo BDPagamento.txt.

Crie um novo projeto

Crie 2 pacotes. Um Chamado View(telas) e outro com Control(controle)

Todas as telas(jframe) estarão em view.

Todas as classes controle, em control.

Telas: Pelo menos 3 telas. Uma para o caixa, um para o pagamento e outro para o cadastro de produtos.

Pelo menos 2 classes: um para produto e outro para pagamento.

(Obs:fazer cada método em sua respectiva classe)

Eu to tentando instanciar uma classe e salvar essa classe em uma List, e depois gravar no TXT, porém como vou fazer pra quando quiser localizar e recuperar as informaçoes dos produtos ? Sempre que o programa iniciar a List estará vazia…

Acredito que a ideia é que os dados dos arquivos txt sejam carregados quando o programa inicia. A lista só ficará vazia se nenhum produto tiver sido cadastrado anteriormente.

Abraço.

1 curtida

A ideia é essa mesmo, porém eu não sei carregar todos os dados do arquivo direto para cada classe na List. Quando eu inicio o programa de novo, os dados estao no arquivo, porem a lista vazia…

Você está salvando o objeto List inteiro, ou cada elemento da lista separadamente? Os dados do arquivos estão legíveis, ou você está gravando-os os objetos serializados?

Do mesmo modo que você gravou os arquivos, você precisa programar a leitura deles a partir do arquivo. O Java não faz isso sozinho. Veja por exemplo: https://www.mkyong.com/java/how-to-read-and-write-java-object-to-a-file/ .

Abraço.

1 curtida

Eu coloquei no botao “Salvar produto” assim, da uma olhada:

	JButton btnSalvarnovoproduto = new JButton("Salvar Novo Produto");
	btnSalvarnovoproduto.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {
			Produto produto = new Produto(txtDescricao.getText(), String.valueOf(cbxMedida.getSelectedItem()),
					Double.parseDouble(txtPreco.getText()));
			if (listaProdutos.add(produto)) {
				produto.cadastrarProduto();
				JOptionPane.showMessageDialog(null, "Produto salvo!");
			}
		}
	});

Esse metodo cadastrar da classe “Produto” está assim:

public void cadastrarProduto() {
	Produto produto = new Produto();
	String caminhoArquivo = "E:\\BDProdutos.txt";
	int codigo = novoCodigo();
	try {

		BufferedWriter bw = new BufferedWriter(new FileWriter(caminhoArquivo, true));

		bw.write(codigo + "@" + descricao + "#" + medida + "$" + preco);
		bw.newLine();
		bw.close();

	} catch (IOException e) {

		System.out.println("Erro: " + e.getMessage());

	}
} 

Meu problema mesmo é com esse metodo aqui :

public int localizarProduto(int codigoProduto) {
	
	String caminhoArquivo = "E:\\BDProdutos.txt";
	int cont = 0,codigo;
	String linha = null;
	try {
		BufferedReader br = new BufferedReader(new FileReader(caminhoArquivo));

		while (br.ready()) {
			linha = br.readLine();
			codigo = Integer.parseInt(linha.substring(0, linha.indexOf("@")));
			if (codigo==codigoProduto) {
				this.codigo=codigo;
				this.descricao=linha.substring(3, linha.indexOf("#"));
				this.medida=linha.substring(linha.indexOf("#")+1, linha.indexOf("$"));
				this.preco=Integer.parseInt(linha.substring(linha.indexOf("$"+1)));
				cont++;
				break;
			} else {

			}

		}
		br.close();
	} catch (Exception e) {

		System.out.println("Erro: " + e.getMessage());
	}
	return cont;
}

Se entendi seu código, cada produto cadastrado está sendo gravado no mesmo arquivo, o que faz com que apenas 1 produto fique cadastrado. Não acho que é isso que você quer. Você tem que gravar cada registro numa nova linha do mesmo arquivo.

Além disso, você precisa debugar ou exibir no console a parte linha = br.readLine();, para garantir que algo está sendo lido. Sem saber se a linha está sendo lida corretamente, não adianta verificar o resto do código.

Por fim, você disse que precisa trabalha com listas. Não faz sentido a busca ir num arquivo, sendo que poderia ser feita a partir da lista já carregada.

No geral, seu algoritmo deveria ser algo assim:

  1. ao abrir o programa, crie um List chamado produtos;
  2. verifica se existe o “BDProdutos.txt”: se existir, carregar cada linha dele como um novo produto e adicione no List produtos;
  3. ao cadastrar um produto, adicioná-lo na lista produtos e salvar o conteúdo da lista no “BDProdutos.txt”;
  4. toda vez que for procurar um produto, buscar dentro do List produtos, não no arquivo "BDProdutos.txt;
  5. restante do programa (venda, etc);

Abraço.

1 curtida

Vou tentar implementar isso aqui, mas aquela parte linha = br.readLine() ela recebe a linha, analisa a condiçao, somente. Ja estava funcionando quando eu trabalhava direto com o arquivo sem lista, mais tarde digo se funcionou, valeuzao !