[RESOLVIDO] Ajuda para criar aplicação que lê e escreve arquivos CSV

98 respostas Resolvido
F


Preciso criar esta aplicação da maniera que me foi solicitado na facul, porem estou com alguns problemas, eu criei o menu da minha aplicação, segue abaixo o código:

import java.util.Scanner;

public class Menu {
boolean sair;

public static void main(String[] args) {

Menu menu = new Menu();
  menu.leOpcoesMenu();

}

public void leOpcoesMenu() {

printCabecalho();

while(!sair) {

printMenu();

int opcao = getInput();

executaAcao(opcao);

}

}
private void printCabecalho() {

System.out.println("------------------------------------------------");

System.out.println("  Bemvindo ao sistema de consulta de chamados   “);

System.out.println(”------------------------------------------------\n");

}
private void printMenu() {

System.out.println(Selecione uma opção para continuar: \n);

System.out.println("Digite 1 para consultar ");

System.out.println("Digite 2 para salvar ");

System.out.println("Digite 3 para carregar ");

System.out.println(Digite 4 para sair \n);

}

private int getInput() {

Scanner leitor = new Scanner(System.in);
  int opcao = -1;
  
  while(opcao < 4) {
  	
  	try {
  		
  		System.out.println("Digite sua escolha: ");
  		opcao = Integer.parseInt(leitor.nextLine());
  		
  		
  	}catch(NumberFormatException e) {
  		
  		System.out.println("Opção inválida, selecione uma opção válida ! \n");
  		
  	}
  }
  
  return opcao;

}

public void executaAcao(int opcao) {

switch(opcao) {
  	
  	case 1:
  		LerEscreverChamado leChamado = new LerEscreverChamado();
  		leChamado.LeChamadosCSV("Chamados.csv");
  		break;
  	case 2:
  		//Salva();
  		break;
  	case 3:
  		//Carrega();
  		break;
  	case 4:
  		sair = true;
  		System.out.println("Obrigado por utilizar minha aplicação kek \n");
  		break;
  	default:
  		System.out.println("Ocorreu um erro desconhecido. \n");
  }

}
}

E também já criei uma classe que lê e escreve no arquivo, segue:

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.PrintWriter;

import javax.swing.JOptionPane;

public class LerEscreverChamado {

public static void LeChamadosCSV(String arquivoCSV) {

BufferedReader leitorCSV = null;
  	
  try {
  		
  	leitorCSV = new BufferedReader(new FileReader(arquivoCSV));
  	String linha = "";
  	leitorCSV.readLine(); // Remove a primeira linha (linha do título)
  	String[] linhaArray;
  	
  	while(( linha = leitorCSV.readLine() ) != null) {
  		linhaArray = linha.split(";"); // Converte string para array
  		
  		for(String s: linhaArray) {
  			System.out.println(s);
  		}
  		System.out.println("");
  	}
  }catch(Exception e) {
  	
  }
  
  return ;

}

public static void escreveNoArquivoCSV(String chamadoID, String Descricao, String DataAbertura, String Custo, String caminhoDoArquivo) {

try {
  		
  	FileWriter fw = new FileWriter(caminhoDoArquivo, true);
  	BufferedWriter bw = new BufferedWriter(fw);
  	PrintWriter pw = new PrintWriter(bw);
  	
  			
  	pw.println(chamadoID + ";" + Descricao + ";" + DataAbertura + ";" + Custo + ";");
  	pw.flush();
  	pw.close();
  			
  	JOptionPane.showMessageDialog(null, "Chamado salvo com sucesso !");

  }catch(Exception E) {
  			System.out.println("Erro ao gravar chamado" + E.getMessage());
  }

}
}

O que acontece é que não estou conseguindo criar a interação que me foi pedida com o menu e a classe, não consigo exibir da maneira que está sendo pedido no exercício.

98 Respostas

T

Olá!
Está no caminho.
Quebre o exercício em várias partes conforme o menu que deverá representar, respeitando as condições gerais e as específicas da seleção para cada opção do menu.
Exemplo:
Gerais

  • O exercício lhe dá 3 planilhas com estruturas similares a tabelas de um BD.
  • Use List, ArrayList e LinkedList, com classes de leitura de arquivo texto.
  • Classes e pacotes especializados para leitura de dados, validação e apresentação.
  • O método principal somente pode chamar as classes e métodos especializados.

Específico para o menu

  • Visualize o que deverá ocorrer quando o usuário selecionar uma das opções identificando as classes e métodos a serem criados/chamados para atender às condições gerais e a opção do menu.

Vai postando a evolução do código que vamos lhe auxiliando.

F

Beleza, refiz o menu pois estava com problemas no switch, aqui está:

import java.util.Scanner;

public class Menu {

public static void main(String[] args) {

Scanner scan = new Scanner(System.in);
  
  System.out.println("------------------------------------------------");
  System.out.println("  Bemvindo ao sistema de consulta de chamados   ");
  System.out.println("------------------------------------------------\n");
  System.out.println("Selecione uma opção para continuar: \n");
  System.out.println("Digite 1 para consultar ");
  System.out.println("Digite 2 para salvar ");
  System.out.println("Digite 3 para carregar ");
  System.out.println("Digite 4 para sair \n");
  
  int opcao = scan.nextInt();
  boolean opcaoValida = true;
  
  	while(opcao == 0 || opcao > 4) {
  		System.out.println("Digite uma opção válida ! \n");
  		opcao = scan.nextInt();		

  	}	

  if(opcao > 0 || opcao <= 4) {	
  	
  		switch(opcao){
  			
  		//Caso 1  - Chama função que recupera os dados do arquivo CSV
  		case 1:{
  			System.out.println("Opcao 1 selecionada");
  			break;
  		}
  			
  		case 2:{
  			System.out.println("Opcao 2 selecionada");
  			break;
  		}
  			
  		case 3:{
  			System.out.println("Opcao 3 selecionada");
  			break;
  		}
  		//Default - Sai da aplicação
  		default:{
  			opcaoValida = false;
  		}
  		}
  }

}
}

Agora vou trabalhar nas classes para realizar as ações.

F
import java.io.File;

import java.util.Scanner;

import javax.swing.JOptionPane;

public class Consulta
{

public static void ConsultaChamados()
{

System.out.println("Por favor, informe o ID do chamado: ");
  
  //Pega o ID em forma de INT e transforma em String
  Scanner scan = new Scanner(System.in);		
  String chamadoID = Integer.toString(scan.nextInt());
  String arquivoCSV = "Chamados.csv";
  LeChamadosCSV(chamadoID, arquivoCSV);

}

public static void LeChamadosCSV(String chamadoID, String arquivoCSV)

{
  
  boolean ResultadoEncontrado = false;
  
  String ID = "";
  String Descricao = "";
  String DataAbertura = "";
  String Custo = "";
  
  try
  {
  
  	Scanner scan = new Scanner(new File(arquivoCSV));
  	scan.useDelimiter(";");
  	
  	while(scan.hasNext() && !ResultadoEncontrado)
  	{
  		ID = scan.next();
  		Descricao = scan.next();
  		DataAbertura = scan.next();
  		Custo = scan.next();
  		
  		if(ID.equals(chamadoID)) {
  			ResultadoEncontrado = true;
  		}
  	}
  	
  	if(ResultadoEncontrado) {
  		System.out.println(
  		"ID: " + ID + "\n" +
  		"Descrição: " + Descricao + "\n" +
  		"Data de abertura: " + DataAbertura + "\n" +
  		"Custo: " + Custo + "\n"
  		);
  	}else {
  		JOptionPane.showMessageDialog(null,"Nenhum registro encontrado !");
  	}
  	
  }catch(Exception E) {
  	System.out.println("ERRO: " + E.getMessage());
  }

}
}

Terminei a consulta porem agora ele ta caindo no catch, e me dando ERRO: Null, alguem pode me ajudar? Tô tentando ler um arquivo csv , de acordo com o id digitado pelo usuario ele busca dentro do arquivo csv pelo id que o usuario digitou, deposita cada dado em variáveis e mostra para o usuário.

F

Preciso entregar hoje a noite e to meio sem prazo se alguem puder me ajudar, quebrei a cabeça aqui mas não sei porque do null.

T

Confere os dados do arquivo Chamados.csv, os quais devem estar separados por “;” e correspondentes ao tipo da variável setada.
Desculpe, no GUJ não fazemos as tarefas e exercícios de casa.

F

Problema anterior resolvido. Agora estou tentando arrumar minha classe para exibir os dados das planilhas.

import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;

import java.util.Scanner;

import javax.swing.JOptionPane;

public class Consulta

{

public static void ConsultaChamados()
{

System.out.println("Por favor, informe o ID do chamado: ");
//Pega o ID em forma de INT e transforma em String

Scanner scan2 = new Scanner(System.in);

String chamadoID = Integer.toString(scan2.nextInt());

String chamadoCSV = Chamados.csv;

String lancamentosCSV = Lançamentos.csv;
LeChamadosCSV(chamadoID, chamadoCSV);
MostraLancamentos(chamadoID, lancamentosCSV);

}

public static void LeChamadosCSV(String chamadoID, String chamadoCSV)

{

boolean ResultadoEncontrado = false;

String linha = "";
String delimitador = ";";
BufferedReader scan = null;

	try
	{
    
	scan = new BufferedReader(new FileReader(chamadoCSV));
	
	while((linha = scan.readLine()) != null)
	{
  	  
		String[] linhas = linha.split(delimitador);
				
		if(linhas[0].equals(chamadoID))
		{
			ResultadoEncontrado = true;
			
			System.out.println
			(		
			"ID: " + linhas[0] + "\n" +
			"Descricao: " + linhas[1] + "\n" + 
			"Data de abertura: " + linhas[2] + "\n" + 
			"Custo: " + linhas[3] + "\n"
			);
			
		}

		if(ResultadoEncontrado == false) {
			System.out.println("Chamado não encontrado !");
		}
	}
	
	
  }
	
	catch(Exception E)
  {
		System.out.println("ERRO: " + E.getMessage());
  }

}

public static void MostraLancamentos(String chamadoID, String lancamentosCSV)

{
  
String linha = "";
String delimitador = ";";
BufferedReader scan = null;

	try
	{
    
	scan = new BufferedReader(new FileReader(lancamentosCSV));
	
    	while((linha = scan.readLine()) != null)
    	{
  		  
    		String[] linhas = linha.split(delimitador);
    				
    		if(linhas[0].equals(chamadoID))
    		{
    			System.out.println("-------------------Lançamento-------------------");
    			System.out.println
    			
    			(
   
    			"ID do Chamado: " + linhas[0] + "\n" +
    			"Data: " + linhas[1]
    			
    			);
    			
    			String statusID = linhas[2];
    			scan = new BufferedReader(new FileReader("Status.csv"));
				while((linha = scan.readLine()) != null)
				{
					linhas = linha.split(delimitador);
					if(statusID.equals(linhas[0]))
					{
    				System.out.println("Status do chamado: " + linhas[1] + "\n" );
					}
				}						
    						
			 }	
    	}
   }
	
	catch(Exception E)
  {
		System.out.println("ERRO: " + E.getMessage());
  }

}

}

E ao rodar o código ele me devolve:

Chamado não encontrado !
ID: 76729
Descricao: Problema na tela de funcionário
Data de abertura: 01/03/2018
Custo: 600.52

-------------------Lançamento-------------------
ID do Chamado: 76729
Data: 04/03/2018
Status do chamado: Construção da E.F pendente

T

Está fazendo tudo num único arquivo.
O exercício pede para utilizar pacotes, classes, List, ArrayList e LinkedList.
Separa tudo primeiro.
Primeiro, veja que possui três planilhas com registros e campos definidos.
Para manipular estes registros necessita de uma entidade (JavaBeans) para cada uma, em arquivos separados (Chamados, Status e Lancamentos), num pacote chamado entidade.
Exemplo:
public class Chamados {

private String ID;
    private String Descricao;
    private String DataAbertura;
    private String Custo;

    public Chamados(String ID, String Descricao, String DataAbertura, String Custo) {
        this.ID = ID;
        this.Descricao = Descricao;
        this.DataAbertura = DataAbertura;
        this.Custo = Custo;
    }
}

Como não vai tratar as variáveis em separado não precisa criar outros getters e setters.

F

Não sei se ajuda mas olha como ta minha estrutura aqui

image

Nessa classe no caso eu já iria chama-la no menu e nos seus methodos eu to tentando ler os arquivos pra encaixa e dar o retorno correto.

T

Depois faz um arquivo de consulta com os métodos, onde irá buscar os dados das planilhas e alocar no construtor Chamados, Status e Lancamentos utilizando List, ArrayList e LinkedList conforme necessário.
Daí parte para o método de pergunta ao usuário e depois ao método de exibição dos dados.

T

Só para lhe dar uma estruturada no projeto.
image
Na prática a designação dos pacotes deve respeitar a convenção Java.
br.com.forna.entidade e etc, mas como está começando pode ser assim mesmo.
Na pasta entidade ficam todas as classes e métodos Chamados, Status e Lancamentos com o seus setters e getters em arquivos separados.
Na pasta modelo ficam as classes e métodos que manipulam os dados.
Na pasta visao fica a classe e métodos do menu em arquivo próprio.

F

Vou tentar aqui seguir esse padrão. Ainda não me acostumei com esses pacotes, é meio estranho pra mim. Essa entidade, modelo, recursos, são pacotes que eu vou usar pra chamar as classes e os metodos? ou são apenas pastas dentro do projeto?

T

Qual é a estrutura de cada arquivo csv?

T

Vai utilizar para chamar, mas a IDE lhe ajuda nisto.

F

Chamados.csv (546 Bytes)
Lançamentos.csv (1,1 KB)
Status.csv (1,1 KB)

Aqui os CSV, pois e, mas a ide me atrapalha um pouco com esse wizards

T

Se acostuma com os wizards com o tempo.
Repliquei seu código e as planilhas aqui.
Vai reestruturando o projeto e avisando o progresso.

F

image

E o menu ta ok só aguardando receber as funções. Esse package equivale-se a um include, tipo eu se quiser usar uma classe da do package modelo, eu importo ele para o arquivo que eu quero usar?

package visao;

import java.util.Scanner;

public class Menu {

public static void main(String[] args) {

Scanner scan = new Scanner(System.in);
  
  System.out.println("------------------------------------------------");
  System.out.println("  Bemvindo ao sistema de consulta de chamados   ");
  System.out.println("------------------------------------------------\n");
  System.out.println("Selecione uma opção para continuar: \n");
  System.out.println("Digite 1 para consultar ");
  System.out.println("Digite 2 para salvar ");
  System.out.println("Digite 3 para carregar ");
  System.out.println("Digite 4 para sair \n");
  
  int opcao = scan.nextInt();
  boolean opcaoValida = true;
  
  	while(opcao == 0 || opcao > 4) {
  		System.out.println("Digite uma opção válida ! \n");
  		opcao = scan.nextInt();		

  	}	

  if(opcao > 0 || opcao <= 4) {	
  	
  		switch(opcao){
  			
  		//Caso 1  - Chama função que recupera os dados do arquivo CSV
  		case 1:{
  			System.out.println("Opcao 1 selecionada");
  			break;
  		}
  			
  		case 2:{
  			System.out.println("Opcao 2 selecionada");
  			break;
  		}
  			
  		case 3:{
  			System.out.println("Opcao 3 selecionada");
  			break;
  		}
  		
  		case 4:{
  			System.out.println("Obrigado por utilizar minha aplicação, saindo... \n");
  			opcaoValida = false;
  		}
  		
  		default:{
  			System.out.println("Erro desconhecido \n");
  			opcaoValida = false;
  		}
  		
  	}
  }

}
}

T

Olhando o código agora, o seu if no método LeChamadosCSV está dentro do while e deveria estar fora.
Outra coisa , na convenção Java a Classe escreve-se “LeChamadosCSV”, mas para métodos se utiliza “leChamadoCSV”, chamam isto de CammelCase.
https://www.oracle.com/technetwork/java/javase/documentation/codeconvtoc-136057.html

T

Isto mesmo. Fará imports quando necessário.
Fica mais fácil de enxergar o que está precisando para seu Menu.

F

No caso o método pra Ler o arquivo de Chamados.csv, no caso esta errado colocar o if dentro do while? entao como eu poderia controlar a exibição?

package modelo;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;

import java.util.Scanner;

import javax.swing.JOptionPane;

public class ConsultaChamados

{	

public static void ConsultaChamados()

{
System.out.println("Por favor, informe o ID do chamado: ");
Scanner scan2 = new Scanner(System.in);

//Pega o ID que o usuario digitou em forma de INT e transforma em String
String chamadoID = Integer.toString(scan2.nextInt());

String chamadoCSV = "Chamados.csv";
String lancamentosCSV = "Lançamentos.csv";


leChamadosCSV(chamadoID, chamadoCSV);
MostraLancamentos(chamadoID, lancamentosCSV);

}

//Método que lê o arquivo Chamados.csv
public static void leChamadosCSV(String chamadoID, String chamadoCSV)

{

boolean ResultadoEncontrado = false;

String linha = "";
String delimitador = ";";
BufferedReader scan = null;

	try
	{
    
	scan = new BufferedReader(new FileReader(chamadoCSV));
	
	while((linha = scan.readLine()) != null)
	{
  	  
		String[] linhas = linha.split(delimitador);
				
		if(linhas[0].equals(chamadoID))
		{
			ResultadoEncontrado = true;
			
			System.out.println
			(		
			"ID: " + linhas[0] + "\n" +
			"Descricao: " + linhas[1] + "\n" + 
			"Data de abertura: " + linhas[2] + "\n" + 
			"Custo: " + linhas[3] + "\n"
			);
			
		}
		
		if(!ResultadoEncontrado)
		{
			System.out.println("Chamado não encontrado !");
		}
	}
	
  } 	
	catch(Exception E)
  {
		System.out.println("ERRO: " + E.getMessage());
  }

}

T

Quem deve controlar é a Classe Menu, pois ela é a chamadora da consulta que é realizada através do método ler.
O resultado da consulta é retornado para a classe principal que informa o usuário e aguarda nova opção ou 4 para sair.

F

Entao eu poderia tirar esse try , o if deixar somente o while retornar estes dados e no menu eu deixo meu if para controlar os dados que serão mostrados?

T

O try … catch tem que ficar, pois está buscando dados de arquivo externo e o erro precisa ser capturado pela Exception.
O if pode migrar para o menu como um retorno do método.
Só para vc entender, o usuário indica 1, a classe principal pelo switch direciona para o case correto. As ações são realizadas pelos métodos da Classe Consulta e o resultado retorna para o menu com os dados a serem informados para o usuário ou registro não encontrado e volta para o menu para nova seleção do usuário.

F

Agora eu travei na hora de retorna esses dados e montar o if no menu, vou descansar um pouco e mais tarde eu tento denovo, no caso pra utilizar a classe que ta na package modelo, eu preciso fazer o import para meu menu ou basta somente fazer o import modelo.ConsultaChamados desta forma?

T

Pode importar desta forma e instanciar
ConsultaChamados consulta = new ConsultaChamados(); para que possa facilmente trazer os métodos quando apertar o sinal de ponto.
Por exemplo:
consulta., a IDE vai lhe sugerir os métodos disponíveis e daí seleciona
consulta.lerChamadosCSV(chamadoID, chamadoCSV);

F

Beleza eu tirei o if

public static void leChamadosCSV(String chamadoID, String chamadoCSV)

  {
  
	  boolean ResultadoEncontrado = false;
	  
	  String linha = "";
	  String delimitador = ";";
	  BufferedReader scan = null;
	  
	  	try
	  	{
		  
	  	scan = new BufferedReader(new FileReader(chamadoCSV));
	  	
	  	while((linha = scan.readLine()) != null)
	  	{
			  
	  		String[] linhas = linha.split(delimitador);
	  	}
	  	
		} 	
	  	catch(Exception E)
		{
	  		System.out.println("ERRO: " + E.getMessage());
		}
  }

Ai a classe lê e retorna os dados, porem quero guarda-los em arraylist eu posso fazer tipo, return []ListaChamados ? Aí lá no meu eu exibo o array e coloco o if, mas não to sabendo como construir

F

E como eu acesso os meus recursos dentro do packet recurso pra passa-los como parametros, tipo como fica o caminho dele dentro do meu projeto?

T

No seu método lerChamadosCSV este if dentro o while estava quase no caminho

O if que pode comentar é este aqui:

Bom, como vc já criou a entidade Chamados, precisa enviar os dados obtidos com a para os setters da sua classe Chamados.

Para isto, terá que modificar o seu método lerChamadosCSV para:

public List<Chamados> lerChamadosCSV(String chamadoID, String chamadoCSV) {

Depois, adiciona uma linha criando uma lista para os chamados.

List<Chamados> listaChamados = new ArrayList<>();

No seu while adicione o trecho abaixo e retorne a lista no final do seu método.

if (dados.length > 0) {
        Chamados chamados = new Chamados();
        chamados.setChamadoID(dados[0]);
        chamados.setDescricao(dados[1]);
        chamados.setDataAbertura(dados[2]);
        chamados.setCusto(dados[3]);
        listaChamados.add(chamados);
    }

Poste o resultado para ver como ficou.

T

No menu, na opção 1 vc chama o método do pacote assim:
Fora do while e próximo do public static void main coloque esta linha:

ConsultaChamados consultaChamados = new ConsultaChamados();

Depois, dentro do case 1, chama o método do seu pacote (ajuste o que for necessário, faça os imports):

List<Chamados> listaChamados = new ArrayList<>();
listaChamados = consultaChamados.lerChamadosCSV(chamadoID, chamadosCSV);
consultaChamados.mostraChamados(chamadoID, listaChamados);

No seu modelo ConsultaChamados comente o seu método de mostrarChamados e coloque este aqui:

public void mostraChamados(String chamadoID, List listaChamados) {
        for (int i = 0; i < listaChamados.size(); i++) {
            Chamados chamados = (Chamados) listaChamados.get(i);
            if (chamados.getChamadoID().equals(chamadoID)) {
                System.out.println("\nID: " + chamados.getChamadoID() + "\n" + "Descricao: " + chamados.getDescricao() + "\n"
                        + "Data de abertura: " + chamados.getDataAbertura() + "\n" + "Custo: " + chamados.getCusto());
            }
        }
    }
F

Ai no case1 eu posso já começar a pegar o id que o usuário irá digitar e o caminho de chamados CSV certo?

package visao;

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

import entidade.Chamados;
import modelo.ConsultaChamados;

public class Menu {

public static void main(String[] args) {

ConsultaChamados consultaChamados = new ConsultaChamados();
  
  Scanner scan = new Scanner(System.in);
  
  System.out.println("------------------------------------------------");
  System.out.println("  Bemvindo ao sistema de consulta de chamados   ");
  System.out.println("------------------------------------------------\n");
  System.out.println("Selecione uma opção para continuar: \n");
  System.out.println("Digite 1 para consultar ");
  System.out.println("Digite 2 para salvar ");
  System.out.println("Digite 3 para carregar ");
  System.out.println("Digite 4 para sair \n");
  
  int opcao = scan.nextInt();
  boolean opcaoValida = true;
  
  	while(opcao == 0 || opcao > 4) {
  		System.out.println("Digite uma opção válida ! \n");
  		opcao = scan.nextInt();		

  	}	

  if(opcao > 0 || opcao <= 4) {	
  	
  		switch(opcao){
  			
  		//Caso 1  - Chama função que recupera os dados do arquivo CSV
  		case 1:
  		{				
  			List<Chamados> listaChamados = new ArrayList<>();
  			listaChamados = consultaChamados.leChamadosCSV(chamadoID, chamadosCSV);
  			consultaChamados.mostraChamados(chamadoID, listaChamados);
  			break;
  		}
  			
  		case 2:{
  			System.out.println("Opcao 2 selecionada");
  			break;
  		}
  			
  		case 3:{
  			System.out.println("Opcao 3 selecionada");
  			break;
  		}
  		
  		case 4:{
  			System.out.println("Obrigado por utilizar minha aplicação, saindo... \n");
  			opcaoValida = false;
  		}
  		
  		default:{
  			System.out.println("Erro desconhecido \n");
  			opcaoValida = false;
  		}
  		
  	}
  }

}
}

Classe Consulta:
Agora ele me diz que preciso criar os metodos getters e setters mas nao sei com o que devo popula-los, no caso seria com um scan para capturar o que o usuario digitar ou eu faço isso no menu?

package modelo;

import java.io.BufferedReader;

import java.io.FileReader;

import java.util.List;

import entidade.Chamados;

public class ConsultaChamados

{	

public void mostraChamados(String chamadoID, List listaChamados)

{		

for (int i = 0; i < listaChamados.size(); i++)

{

Chamados chamados = (Chamados) listaChamados.get(i);
if (chamados.getChamadoID().equals(chamadoID))
        {
            System.out.println(
            		"\nID: " + chamados.getChamadoID() +
            		"\n" + "Descricao: " + chamados.getDescricao() +
            		"\n" + "Data de abertura: " + chamados.getDataAbertura() +
            		"\n" + "Custo: " + chamados.getCusto()
            );
        }
    }
}

public static void leChamadosCSV(String chamadoID, String chamadoCSV)

{

    boolean ResultadoEncontrado = false;
    
    String linha = "";
    String delimitador = ";";
    BufferedReader scan = null;
    
    	try
    	{
  	  
    	scan = new BufferedReader(new FileReader(chamadoCSV));
    	
    	while((linha = scan.readLine()) != null)
    	{
  		  
    		String[] linhas = linha.split(delimitador);
    	}
    	
  	} 	
    	catch(Exception E)
  	{
    		System.out.println("ERRO: " + E.getMessage());
  	}
}

}

T

Isto mesmo.
Devolve para o case1 o seu código que vc removeu.

System.out.println("Opcao 1 selecionada");
        System.out.println("Por favor, informe o ID do chamado: ");

        //Pega o ID em forma de INT e transforma em String
        String chamadoID = Integer.toString(scan.nextInt());
T

Vai popular os setters conforme lhe expliquei na resposta 28.

F

Agora eu me confundi todo com o código, minha classe está assim:

package modelo;

import java.io.BufferedReader;

import java.io.FileReader;

import java.util.List;

import entidade.Chamados;

public class ConsultaChamados

{	

public void mostraChamados(String chamadoID, List listaChamados)

{		

for (int i = 0; i < listaChamados.size(); i++)

{

Chamados chamados = (Chamados) listaChamados.get(i);
if (chamados.getChamadoID().equals(chamadoID))
        {
            System.out.println(
            		"\nID: " + chamados.getChamadoID() +
            		"\n" + "Descricao: " + chamados.getDescricao() +
            		"\n" + "Data de abertura: " + chamados.getDataAbertura() +
            		"\n" + "Custo: " + chamados.getCusto()
            );
        }
    }
}

public List lerChamadosCSV(String chamadoID, String chamadoCSV)

{

    boolean ResultadoEncontrado = false;
    
    String dados = "";
    String delimitador = ";";
    BufferedReader scan = null;
    
    	try
    	{
  	  
    	scan = new BufferedReader(new FileReader(chamadoCSV));
    	
    	while((dados = scan.readLine()) != null)
    	{
  		  
    	    if (dados.length > 0) {
    	        Chamados chamados = new Chamados();
    	        chamados.setChamadoID(dados);
    	        chamados.setDescricao(dados);
    	        chamados.setDataAbertura(dados);
    	        chamados.setCusto(dados);
    	        listaChamados.add(chamados);
    	    }
    	}
    	
  	} 	
    	catch(Exception E)
  	{
    		System.out.println("ERRO: " + E.getMessage());
  	}
}

}

T

Antes deste código coloca a linha do List
List<Chamados> listaChamados = new ArrayList<>();

Antes da última } coloque
return listaChamados;

Depois executa o menu para ver o resultado .

F

image
image

Estou com estes problemas aqui , por conta da falta desses getters e setters que não entendi como fazer.

T

Precisa criar os getters e setters na classe Chamados.
No Eclipse, estando na classe Chamados segue este exemplo.
https://www.mkyong.com/eclipse/generate-getters-and-setters-in-eclipse-ide/

Faltou fazer aquilo que lhe falei na resposta 30.

Recoloque o seu código acima na classe Menu para localizar o arquivo CSV.

F

Agora o menu está legível para mim segue o código:

package visao;

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

import entidade.Chamados;
import modelo.ConsultaChamados;

public class Menu {

public static void main(String[] args) {

ConsultaChamados consultaChamados = new ConsultaChamados();
  
  String chamadosCSV = "recursos/Chamados.csv";
  
  Scanner scan = new Scanner(System.in);
  
  System.out.println("------------------------------------------------");
  System.out.println("  Bemvindo ao sistema de consulta de chamados   ");
  System.out.println("------------------------------------------------\n");
  System.out.println("Selecione uma opção para continuar: \n");
  System.out.println("Digite 1 para consultar ");
  System.out.println("Digite 2 para salvar ");
  System.out.println("Digite 3 para carregar ");
  System.out.println("Digite 4 para sair \n");
  
  int opcao = scan.nextInt();
  boolean opcaoValida = true;
  
  	while(opcao == 0 || opcao > 4) {
  		System.out.println("Digite uma opção válida ! \n");
  		opcao = scan.nextInt();		

  	}	

  if(opcao > 0 || opcao <= 4) {	
  	
  		switch(opcao){
  			
  		//Caso 1  - Chama função que recupera os dados do arquivo CSV
  		case 1:
  		{	  
  			//Pede ao usuário para informar o ID do chamado
  			System.out.println("Por favor, informe o ID do chamado: ");
  			
  			//A variavel aqui chama scan2 pois já existe outra variável com o nome scan
  			Scanner scan2 = new Scanner(System.in);	
  			
  			//Pegamos o ID em forma de INT e transformamos em String
  			String chamadoID = Integer.toString(scan2.nextInt());	
  			
  			//Criamos nosso ArrayList
  			List<Chamados> listaChamados = new ArrayList<>();
  			
  			//Recebemos o resultado da classe e o armazenamos na ArrayList
  			
  			listaChamados = consultaChamados.lerChamadosCSV(chamadoID, chamadosCSV);
  			consultaChamados.mostraChamados(chamadoID, listaChamados);
  			break;
  		}
  			
  		case 2:{
  			System.out.println("Opcao 2 selecionada");
  			break;
  		}
  			
  		case 3:{
  			System.out.println("Opcao 3 selecionada");
  			break;
  		}
  		
  		case 4:{
  			System.out.println("Obrigado por utilizar minha aplicação, saindo... \n");
  			opcaoValida = false;
  		}
  		
  		default:{
  			System.out.println("Erro desconhecido \n");
  			opcaoValida = false;
  		}
  		
  	}
  }

}
}

A minha classe está assim:

package modelo;

import java.io.BufferedReader;

import java.io.FileReader;

import java.util.ArrayList;

import java.util.List;

import entidade.Chamados;

public class ConsultaChamados

{
public List lerChamadosCSV(String chamadoID, String chamadoCSV)

{

    boolean ResultadoEncontrado = false;
    List<Chamados> listaChamados = new ArrayList<>();
    
    String dados = "";
    String delimitador = ";";
    BufferedReader scan = null;
    
    	try
    	{
  	  
    	scan = new BufferedReader(new FileReader(chamadoCSV));
    	
    	while((dados = scan.readLine()) != null)
    	{
  		  
    	    if (dados.length > 0) {
    	        Chamados chamados = new Chamados();
    	        chamados.setChamadoID(dados);
    	        chamados.setDescricao(dados);
    	        chamados.setDataAbertura(dados);
    	        chamados.setCusto(dados);
    	        listaChamados.add(chamados);
    	    }
    	}
    	
  	} 	
    	catch(Exception E)
  	{
    		System.out.println("ERRO: " + E.getMessage());
  	}
    	
    	return listaChamados;
}
public void mostraChamados(String chamadoID, List listaChamados)

{		

for (int i = 0; i < listaChamados.size(); i++)

{

Chamados chamados = (Chamados) listaChamados.get(i);
if (chamados.getChamadoID().equals(chamadoID))
        {
            System.out.println(
            		"\nID: " + chamados.getChamadoID() +
            		"\n" + "Descricao: " + chamados.getDescricao() +
            		"\n" + "Data de abertura: " + chamados.getDataAbertura() +
            		"\n" + "Custo: " + chamados.getCusto()
            );
        }
    }
}

}

E os getters e setters da Classe Chamado estão aqui:

package entidade;

public class Chamados {

private String dados;

public void setChamadoID(String dados) {

this.dados = dados;

}
public Object getChamadoID() {

return getChamadoID();

}
public String getDescricao() {

return getDescricao();

}
public String getDataAbertura() {

return getDataAbertura();

}
public String getCusto() {

return getCusto();

}
public void setDescricao(String dados) {

this.dados = dados;

}
public void setDataAbertura(String dados) {

this.dados = dados;

}
public void setCusto(String dados) {

this.dados = dados;

}

}

Rodei o código e o resultado foi:


Bemvindo ao sistema de consulta de chamados

Selecione uma opção para continuar:

Digite 1 para consultar
Digite 2 para salvar
Digite 3 para carregar
Digite 4 para sair

1
Por favor, informe o ID do chamado:
76729
ERRO: recursos\Chamados.csv (O sistema não pode encontrar o caminho especificado)

Tentei mudar o caminho que está recursos/Chamados.csv para Chamados.csv mas não adiantou, ai fica minha dúvida, posso navegar por eles assim como por exemplo chamo um script em uma página web ?

T

Copie os arquivo CSV para a raiz do seu projeto e rode novamente.

F

Estranho, mesmo aqui ele não encontra o arquivo.

image

T

Mas alterou a string para ficar como “Chamados.csv”?

F

Sim

T

Experimente, temporariamente, colocar o caminho completo ao arquivo.

F

Veja eu subi os arquivos mais um nível e agora ele está me dando um erro diferente:

T

Entendi.
A sua Classe Chamados tem que estar assim:

public class Chamados {

private String chamadoID;
private String Descricao;
private String DataAbertura;
private String Custo;

public Chamados() {
}

public Chamados(String chamadoID, String Descricao, String DataAbertura, String Custo) {
    this.chamadoID = chamadoID;
    this.Descricao = Descricao;
    this.DataAbertura = DataAbertura;
    this.Custo = Custo;
}

public String getChamadoID() {
    return chamadoID;
}

public void setChamadoID(String chamadoID) {
    this.chamadoID = chamadoID;
}

public String getDescricao() {
    return Descricao;
}

public void setDescricao(String Descricao) {
    this.Descricao = Descricao;
}

public String getDataAbertura() {
    return DataAbertura;
}

public void setDataAbertura(String DataAbertura) {
    this.DataAbertura = DataAbertura;
}

public String getCusto() {
    return Custo;
}

public void setCusto(String Custo) {
    this.Custo = Custo;
}
F

Sem erros até então, acredito que esteja lendo porem não está exibindo ainda .

T

Agora sim.
Deveria trazer para a tela o resultado o método mostraChamados. Dá uma conferida nos parâmetros.

Depois, vai precisar partir para a Classe ConsultaLancamentos onde irá fazer a mesma coisa que fez para a Classe Chamados e trazer os métodos para o case 1, após os métodos da ConsultaChamados.

T

Oi, neste ponto está errado. Deveria estar assim:

while ((linha = arquivo.readLine()) != null) {
        String[] dados = linha.split(separador);
         if (dados.length > 0) {
              Chamados chamados = new Chamados();
              ...
F

Perfeito,

try
{

scan = new BufferedReader(new FileReader(chamadosCSV));

    	while((linha = scan.readLine()) != null)
    		
    	{
    		String[] dados = linha.split(delimitador);
    		
    	    if (dados.length > 0)
    	    {
    	        Chamados chamados = new Chamados();
    	        chamados.setChamadoID(dados[0]);
    	        chamados.setDescricao(dados[1]);
    	        chamados.setDataAbertura(dados[2]);
    	        chamados.setCusto(dados[3]);
    	        listaChamados.add(chamados);
    	    }

retorno

Partindo pra cima dos lancamentos

F

Segue a minha classe de lista de lancamentos

package modelo;

import java.io.BufferedReader;

import java.io.FileReader;

import java.util.ArrayList;

import java.util.List;

import entidade.Lancamentos;

public class ConsultaLancamentos {

public List lerLancamentosCSV(String chamadoID, String lancamentosCSV)

{

    boolean ResultadoEncontrado = false;
    List<Lancamentos> listaLancamentos = new ArrayList<>();
    
    String linha = "";
    String delimitador = ";";
    BufferedReader scan = null;
    
    	try
    	{
  	  
    	scan = new BufferedReader(new FileReader(lancamentosCSV));

    	while((linha = scan.readLine()) != null)
    		
    	{
    		String[] dados = linha.split(delimitador);
    		
    	    if (dados.length > 0)
    	    {
    	        Lancamentos lancamentos = new Lancamentos();
    	        lancamentos.setChamadoID(dados[0]);
    	        lancamentos.setDataLancamento(dados[1]);
    	        lancamentos.setStatusID(dados[2]);
    	        listaLancamentos.add(lancamentos);
    	    }
    	}
    	
  	} 	
    	catch(Exception E)
  	{
    		System.out.println("ERRO: " + E.getMessage());
  	}
    	
    	return listaLancamentos;
}
public void mostraLancamentos(String chamadoID, List listaLancamentos)

{		

for (int i = 0; i < listaLancamentos.size(); i++)

{

Lancamentos lancamentos = (Lancamentos) listaLancamentos.get(i);
if (lancamentos.getChamadoID().equals(chamadoID))
        {
            System.out.println
            (
            "\n" + "ID: " + lancamentos.getChamadoID() +
            "\n" + "Data de lançamento do chamado: " + lancamentos.getDataLancamento() +
            "\n" + "Status do chamado: " + lancamentos.getStatusID()
            );
        }
    }
}

}

Os getters e os setters:

package entidade;

public class Lancamentos {

private String chamadoID;

private String DataLancamento;

private String StatusID;

public Lancamentos() {
}

public Lancamentos(String chamadoID, String DataLancamento, String StatusID) {

this.chamadoID = chamadoID;
this.DataLancamento = DataLancamento;
this.StatusID = StatusID;

}

public String getChamadoID() {

return chamadoID;

}
public void setChamadoID(String chamadoID) {

this.chamadoID = chamadoID;

}
public String getDataLancamento() {

return DataLancamento;

}
public void setDataLancamento(String DataLancamento) {

this.DataLancamento = DataLancamento;

}
public String getStatusID() {

return StatusID;

}
public void setStatusID(String StatusID) {

this.StatusID = StatusID;

}

}

e o menu

package visao;

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;
import entidade.Chamados;

import entidade.Lancamentos;

import modelo.ConsultaChamados;

import modelo.ConsultaLancamentos;

public class Menu {

public static void main(String[] args) {

ConsultaChamados consultaChamados = new ConsultaChamados();
  ConsultaLancamentos consultaLancamentos = new ConsultaLancamentos();
  
  String chamadosCSV = "Chamados.csv";
  String lancamentosCSV = "Lançamentos.csv";
  
  Scanner scan = new Scanner(System.in);
  
  System.out.println("------------------------------------------------");
  System.out.println("  Bemvindo ao sistema de consulta de chamados   ");
  System.out.println("------------------------------------------------\n");
  System.out.println("Selecione uma opção para continuar: \n");
  System.out.println("Digite 1 para consultar ");
  System.out.println("Digite 2 para salvar ");
  System.out.println("Digite 3 para carregar ");
  System.out.println("Digite 4 para sair \n");
  
  int opcao = scan.nextInt();
  boolean opcaoValida = true;
  
  	while(opcao == 0 || opcao > 4) {
  		System.out.println("Digite uma opção válida ! \n");
  		opcao = scan.nextInt();		

  	}	

  if(opcao > 0 || opcao <= 4) {	
  	
  		switch(opcao){
  			
  		//Caso 1  - Chama função que recupera os dados do arquivo CSV
  		case 1:
  		{	  
  			//Pede ao usuário para informar o ID do chamado
  			System.out.println("Por favor, informe o ID do chamado: ");
  			
  			//A variavel aqui chama scan2 pois já existe outra variável com o nome scan
  			Scanner scan2 = new Scanner(System.in);	
  			
  			//Pegamos o ID em forma de INT e transformamos em String
  			String chamadoID = Integer.toString(scan2.nextInt());	
  			
  			//Criamos nosso ArrayList
  			List<Chamados> listaChamados = new ArrayList<>();
  			List<Lancamentos> listaLancamentos = new ArrayList<>();
  			
  			//Recebemos o resultado da classe e o armazenamos na ArrayList
  			
  			//Lista e exibe Chamados
  			listaChamados = consultaChamados.lerChamadosCSV(chamadoID, chamadosCSV);
  			consultaChamados.mostraChamados(chamadoID, listaChamados);
  			
  			//Lista e exibe Lancamentos
  			listaLancamentos = consultaLancamentos.lerLancamentosCSV(chamadoID, lancamentosCSV);
  			consultaLancamentos.mostraLancamentos(chamadoID, listaChamados);
  			
  			break;
  		}
  			
  		case 2:{
  			System.out.println("Opcao 2 selecionada");
  			break;
  		}
  			
  		case 3:{
  			System.out.println("Opcao 3 selecionada");
  			break;
  		}
  		
  		case 4:{
  			System.out.println("Obrigado por utilizar minha aplicação, saindo... \n");
  			opcaoValida = false;
  		}
  		
  		default:{
  			System.out.println("Erro desconhecido \n");
  			opcaoValida = false;
  		}
  		
  	}
  }

}
}

Ao rodar eu recebo um erro

Não entendo, qual o problema com este cast?

T

O problema está na linha 59 da ConsultaLancamentos.

F

Sim, ele me diz que é um problema com o cast type mas , eu não entendi aonde

Lancamentos lancamentos = (Lancamentos) listaLancamentos.get(i);

Eu poderia tirar o cast e ele entenderia que é do tipo lancamentos ?

lancamentos = listaLancamentos.get(i);

T

Esta é a linha 59?

F

Desculpe arrumei, o problema era no menu, ao invez de listaLancamentos eu coloquei Chamados

consultaLancamentos.mostraLancamentos(chamadoID, listaChamados);

Segue o retorno do console:

Bom, agora é que vem o pulo do gato, preciso filtrar este status do chamado e carregar o Status.csv

T

OK.
O pulo do gato é que a Classe Status você não utiliza no menu mas na Classe ConsultaLancamentos.
Faz do mesmo jeito que para as outras classes Consulta, mas ao invés de chamar o método mostraStatus no menu vc chama-o no mostraLancamentos após o System.out.println.
Entendeu? Faz aí e me avisa.

F

Me surgiu uma dúvida, no caso creio que não vá precisar passar como paramêtro a este metodo o chamadoID, eu preciso do ID que esta no arquivo lancamento, então no caso eu poderia tira-lo da li e substitui-lo por statusID ? E ai eu preencheria com o dado que vem do arquivo Lancamento.csv

image

T

Isto mesmo.

F

Então a classe ficou assim:

package modelo;

import java.io.BufferedReader;

import java.io.FileReader;

import java.util.ArrayList;

import java.util.List;

import entidade.Lancamentos;
import entidade.StatusID;

public class ConsultaStatus

{

public List lerStatusCSV(String StatusID, String StatusCSV)

{

    boolean ResultadoEncontrado = false;
    List<StatusID> listaStatusID = new ArrayList<>();
    
    String linha = "";
    String delimitador = ";";
    BufferedReader scan = null;
    
    	try
    	{
  	  
    	scan = new BufferedReader(new FileReader(StatusCSV));

    	while((linha = scan.readLine()) != null)
    		
    	{
    		String[] dados = linha.split(delimitador);
    		
    	    if (dados.length > 0)
    	    {
    	        StatusID statusID = new StatusID();
    	        statusID.setStatusID(dados[0]);
    	        statusID.setDescricao(dados[1]);
    	        listaStatusID.add(statusID);
    	    }
    	}
    	
  	} 	
    	catch(Exception E)
  	{
    		System.out.println("ERRO: " + E.getMessage());
  	}
    	
    	return listaStatusID;
}
public void mostraStatus(String statusID, List listaStatus)

{		

for (int i = 0; i < listaStatus.size(); i++)

{

StatusID status = (StatusID) listaStatus.get(i);
if (status.getStatusID().equals(statusID))
        {
            System.out.println
            (
            "\n" + "Status do chamado: " + status.getDescricao()
            );
        }
    }
}

}

E os getters e setters:

package entidade;

public class StatusID

{

private String statusID;

private String descricao;
public StatusID(){

this.statusID = statusID;

this.descricao = descricao;

}
public void setStatusID(String statusID) {

this.statusID = statusID;

}
public void setDescricao(String descricao) {

this.descricao = descricao;

}
public Object getStatusID() {

return statusID;

}
public String getDescricao() {

return descricao;

}

}

e na ConsultaLancamentos eu to chamando ela

package modelo;

import java.io.BufferedReader;

import java.io.FileReader;

import java.util.ArrayList;

import java.util.List;

import entidade.Lancamentos;

public class ConsultaLancamentos

{

public List lerLancamentosCSV(String chamadoID, String lancamentosCSV)

{

    boolean ResultadoEncontrado = false;
    List<Lancamentos> listaLancamentos = new ArrayList<>();
    
    String linha = "";
    String delimitador = ";";
    BufferedReader scan = null;
    
    	try
    	{
  	  
    	scan = new BufferedReader(new FileReader(lancamentosCSV));

    	while((linha = scan.readLine()) != null)
    		
    	{
    		String[] dados = linha.split(delimitador);
    		
    	    if (dados.length > 0)
    	    {
    	        Lancamentos lancamentos = new Lancamentos();
    	        lancamentos.setChamadoID(dados[0]);
    	        lancamentos.setDataLancamento(dados[1]);
    	        lancamentos.setStatusID(dados[2]);
    	        listaLancamentos.add(lancamentos);
    	    }
    	}
    	
  	} 	
    	catch(Exception E)
  	{
    		System.out.println("ERRO: " + E.getMessage());
  	}
    	
    	return listaLancamentos;
}
public void mostraLancamentos(String chamadoID, List listaLancamentos)

{		

for (int i = 0; i < listaLancamentos.size(); i++)

{

Lancamentos lancamentos = (Lancamentos) listaLancamentos.get(i);
if (lancamentos.getChamadoID().equals(chamadoID))
        {
            System.out.println
            (
            "\n" + "ID: " + lancamentos.getChamadoID() +
            "\n" + "Data de lançamento do chamado: " + lancamentos.getDataLancamento() +
            "\n" + "Status do chamado: " + lancamentos.getStatusID()
            );
            
            String StatusID = lancamentos.getStatusID();
            String StatusCSV = "Status.csv";
            ConsultaStatus consultaStatus = new ConsultaStatus();
            consultaStatus.lerStatusCSV(StatusID, StatusCSV);
        }
    }
}

}

Rodei o código aqui mas não me trouxe as descricoes do chamado

T

Neste ponto faz assim:

String StatusCSV = "Status.csv"; // este aqui pode fixar na própria Classe ConsultaStatus

ConsultaStatus consultaStatus = new ConsultaStatus();

Faltou instanciar a List e chamar o método de consultaStatus
Depois este:

consultaStatus.lerStatusCSV(lancamentos.getStatusID(), listaStatus);

F

Ele me mostra este erro

T

Sim. Está faltando o List.
Olha como fez no menu que vai ver que está faltando obter a lista.

F

Ah sim é verdade,

String StatusID = lancamentos.getStatusID();
            List<StatusID> listaStatusID = new ArrayList<>();
            ConsultaStatus consultaStatus = new ConsultaStatus();
            consultaStatus.listaStatus(lancamentos.getStatusID(), listaStatusID);

Agora esta ok , mas ele ainda não ta me printando a coluna descricao

T

Falta a listaStatusID que é o retorno do método lerStatus.

F

package modelo;

import java.io.BufferedReader;

import java.io.FileReader;

import java.util.ArrayList;

import java.util.List;

import entidade.Lancamentos;
import entidade.StatusID;

public class ConsultaStatus

{
String StatusCSV = “Status.csv”;

public List lerStatusCSV(String StatusID, String StatusCSV)

{

    boolean ResultadoEncontrado = false;
    List<StatusID> listaStatusID = new ArrayList<>();
    
    String linha = "";
    String delimitador = ";";
    BufferedReader scan = null;
    
    	try
    	{
  	  
    	scan = new BufferedReader(new FileReader(StatusCSV));

    	while((linha = scan.readLine()) != null)
    		
    	{
    		String[] dados = linha.split(delimitador);
    		
    	    if (dados.length > 0)
    	    {
    	        StatusID statusID = new StatusID();
    	        statusID.setStatusID(dados[0]);
    	        statusID.setDescricao(dados[1]);
    	        listaStatusID.add(statusID);
    	    }
    	}
    	
  	} 	
    	catch(Exception E)
  	{
    		System.out.println("ERRO: " + E.getMessage());
  	}
    	
    	return listaStatusID;
}
public void listaStatus(String statusID, List listaStatusID)

{		

for (int i = 0; i < listaStatusID.size(); i++)

{

StatusID status = (StatusID) listaStatusID.get(i);
if (status.getStatusID().equals(statusID))
        {
            System.out.println
            (
            "\n" + "Status do chamado: " + status.getDescricao()
            );
        }
    }
}

}

mas eu estou chamando o listaStatus

T
Assim:

String StatusID = lancamentos.getStatusID();

List listaStatusID = new ArrayList<>();

ConsultaStatus consultaStatus = new ConsultaStatus();

<strong>listaStatusID = consultaStatus.lerStatus();</strong>

consultaStatus.listaStatus(lancamentos.getStatusID(), listaStatusID);
F

Desculpa a distração, agora deu certo, ajeitei a saída para igual do exercício também, veja só:

Ficou perfeito

F

Indo para o passo 2, agora vou repetir o código no case 1 e depois dar a opção de renomear o arquivo e salva-lo, eu tenho uma dúvida, para chamar o menu novamente, como ele também é uma classe de view, eu posso invoca-lo normalmente após o código para isso acontecer certo?

T

Pode. O certo era colocar o menu num laço. Mas pode fazer depois.

F

Agora no case 2 do switch do menu, repito a ação anterior e solicito um nome para o arquivo que será salvo:

case 2:{

//Pede ao usuário para informar o ID do chamado

System.out.println("Por favor, informe o ID do chamado: ");

//A variavel aqui chama scan2 pois já existe outra variável com o nome scan
Scanner scan2 = new Scanner(System.in);

//Pegamos o ID em forma de INT e transformamos em String
String chamadoID = Integer.toString(scan2.nextInt());

//Criamos nosso ArrayList

List listaChamados = new ArrayList<>();

List listaLancamentos = new ArrayList<>();

//Recebemos o resultado da classe e o armazenamos na ArrayList

//Lista e exibe Chamados

listaChamados = consultaChamados.lerChamadosCSV(chamadoID, chamadosCSV);

consultaChamados.mostraChamados(chamadoID, listaChamados);
//Lista e exibe Lancamentos

listaLancamentos = consultaLancamentos.lerLancamentosCSV(chamadoID, lancamentosCSV);

consultaLancamentos.mostraLancamentos(chamadoID, listaLancamentos);

/////////////////////////////////////////////////////////////////////////////////

//Pede ao usuário para informar o nome do arquivo que será salvo
System.out.println("Por favor, informe o nome do arquivo a ser salvo: ");

//A variavel aqui chama scan3 pois já existe outra variável com o nome scan2
Scanner scan3 = new Scanner(System.in);

//Pegamos o nome do arquivo em forma String
String NomedoArquivo = scan3.nextLine();

Pronto agora basta salvar este arquivo gerado em um novo arquivo com o nome que o usuario escolheu

T

Não precisa instanciar novamente o Scanner.
Para salvar precisa dos dados serializados encaminhando para um arquivo.

F

Como eu quero entao salvar em um novo arquivo a busca que o usuario fez eu crio um retorno de todos os dados que eu exibi e escrevo num novo arquivo certo?

F

Mas se eu não instanciar um novo scan ele vai guardar o valor no scan anterior tb e ai quando eu chama o menu vai da xabu

T

É por aí.

T

Na verdade o Scanner vai reiniciar quando chamar o menu. Tem que ver como vai tratar o laço depois.

F

Talvez colocar o cabeçalho e as opções dentro de metodos e chama-los, eu queria agora retornar todos os dados que foram printados pro usuario e recebe-los nessa classe auqi

import java.io.FileOutputStream;
import java.io.PrintWriter;

public class SalvaConsulta {

public void EscreveNoArquivoCSV() {
	
	FileOutputStream arquivoCSV = new FileOutputStream("Nome do CSV que o usuario escolheu", true);
	PrintWriter salvaArquivo = new PrintWriter(arquivoCSV);
	
	salvaArquivo.println("Nome do arquivo no qual vou escrever");
	
}

}

Porque ai no caso escrevendo eu posso salvar o arquivo certo?

F

Alias, acho que o correto é criar um novo CSV

T

Quando serializa trata os dados como objetos.
Veja isto:


Não sei se seu Professor(a) vai querer os dados em texto puro.
Pela descrição do case 2, aparentemente não.

F

Eu tenho eu retorno tudo num arrayList e por ser serializavel por padrão eu consigo passa-lo por parametro pegar na minha classe que vai salva os arquivos

T

Mas não será toda a lista, somente o registro informado pelo usuário.
Monte o método todo. Vamos ver o que consegue.
Uma dica para lhe ajudar: nas classes do pacote entidade crie um método chamado toString.

F

package visao;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectOutputStream;

import java.io.PrintWriter;

import java.util.ArrayList;

import java.util.List;

public class SalvaConsulta {

public void EscreveNoArquivoCSV(String NomeDoArquivo, List ListaConsulta) {

ArrayList<String> listaConsulta = new ArrayList();
  			
   try{
  	 FileOutputStream arquivoCSV = new FileOutputStream(NomeDoArquivo);
       ObjectOutputStream saidaDoArquivo = new ObjectOutputStream(arquivoCSV);
       
       saidaDoArquivo.writeObject(listaConsulta);
       saidaDoArquivo.close();
       arquivoCSV.close();
     }catch(IOException ioe){
          ioe.printStackTrace();
      }

}
}

Assim eu recebo o resultado em forma de lista certo e escrevo no arquivo e salvo ele, agora eu preciso serializar os dados que retornaram ao usuario e com essa classe eu des-serializo certo?

T

Esta List listaConsulta vem da listaChamados e listaLancamentos?
Se sim, vai sobrepor o conteúdo se acionada duas vezes ou mais.

F

Então antes eu preciso pegar o resultado transformar em uma lista e passar pra essa função ne, ai no caso seria a lista que recebe o retorno da busca que o usuário fez

T

Sim. Tem que colocar numa nova ArrayList com o método add o retorno de cada entidade, conforme o número do chamado indicado pelo usuário, para que possa salvar ao final no arquivo.
Utilize println com a nova ArrayList método .toString para ver na tela o que está ocorrendo. Depois se preocupa em salvar no arquivo.

F

Certo, agora ele está serializado, e eu posso jogar na minha classe

T

Isto. Mas tem que utilizar o .toString para não colocar no arquivo estes tipos de informações “entidade.Lancamentos@7d4991ad”. O certo e trazer os dados.

T

Cria este classe de teste e veja como ficam os dados no seu conteúdo.

public class ArrayListSerialization
{
   public static void main(String [] args)
   {
       ArrayList<String> al=new ArrayList<String>();
       al.add("Hello");
       al.add("Hi");
       al.add("Howdy");

       try{
         FileOutputStream fos= new FileOutputStream("myfile");
         ObjectOutputStream oos= new ObjectOutputStream(fos);
         oos.writeObject(al);
         oos.close();
         fos.close();
       }catch(IOException ioe){
            ioe.printStackTrace();
        }
   }
}

Seu arquivo tem que ficar parecido com este.
DadosSalvos.txt (274 Bytes)

F
String lista = listaConsulta.toString();
				System.out.println(lista);

e ainda me devolve array

T

Muita calma nesta hora.
Depois que o usuário informa o número do chamado e indica o nome do arquivo para salvar.
O número é obtido pelo método mostraChamados, depois vc precisa pegar estes dados com .toString e depois colocar numa array nova para direcionar para o arquivo. Para Chamados, Lancamentos e Status.

zzzzz.add(serialChamados.toString());

T

Neste seu case2 está obtendo o conteúdo da lista inteira sem fazer a seleção do chamadoID informado pelo usuário.

F

Ah entendi esse ‘recupera’ como trazer a lista e depois da exibicao pergunta o nome do arquivo que o usuario quer salvar

F

ai no caso farei outro scan e dps eu recebo as listas ?

T

Não precisa exibir para o usuário.
Coloque num println para você ver o resultado na tela.
O case3 irá fazer a exibição completa depois.

T

Pode ser direto. Pede o número e depois o nome do arquivo.
Na sequência obtêm o registro indicado (dados do chamado, lancamentos e status) coloca num array e direciona para o arquivo.
Localizei um exemplo bem didático.
https://www.devmedia.com.br/introducao-a-serializacao-de-objetos/3050

F
ArrayList listaConsulta = new ArrayList<>();
  			listaConsulta.add(listaChamados);
  			listaConsulta.add(listaLancamentos);
  			
  			String lista = listaConsulta.toString();
  			System.out.println(lista);

Nesse bloco ele me retorna o valor em array e não string

F

No caso eu interpreto o objeto do tutorial como o meu arraylist ne pois ambos podem ser serializados e des-serializados

F

Tentei assim e também não resolveu, no caso eu posso mandar direto pra classe que faz a des-serialização, mesmo em forma de array?

ArrayList listaConsulta = new ArrayList<>();
  			listaConsulta.add(listaChamados.toString());
  			listaConsulta.add(listaLancamentos.toString());
  			
  			System.out.println(listaConsulta);
F

Veja como está minha classe

package visao;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectOutputStream;

import java.io.PrintWriter;

import java.util.ArrayList;

import java.util.List;

public class SalvaConsulta {

public void SalvaArquivo(String NomeDoArquivo, List ListaConsulta) {

ArrayList<String> listaConsulta = new ArrayList();
  try 
  {
  		
  //Gera o arquivo para armazenar o objeto
  		 
  FileOutputStream arquivoGrav =
  	 
  new FileOutputStream(NomeDoArquivo);
  	     
  //Classe responsavel por inserir os objetos
  ObjectOutputStream objGravar = new ObjectOutputStream(arquivoGrav);
  		 
  //Grava o objeto cliente no arquivo
  		 
  objGravar.writeObject(listaConsulta);
  		 
  objGravar.flush(); 
  objGravar.close();
  		 
  arquivoGrav.flush();	 
  arquivoGrav.close();
  		 
  System.out.println("Objeto gravado com sucesso!");
  		 
  }
   
  catch(Exception e)
  {
   
  	e.printStackTrace();
   
  }

}
}

Retorno

e meu menu

package visao;

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;
import entidade.Chamados;

import entidade.Lancamentos;

import modelo.ConsultaChamados;

import modelo.ConsultaLancamentos;

public class Menu {

public static void main(String[] args) {

ConsultaChamados consultaChamados = new ConsultaChamados();
  ConsultaLancamentos consultaLancamentos = new ConsultaLancamentos();
  
  String chamadosCSV = "Chamados.csv";
  String lancamentosCSV = "Lançamentos.csv";
  
  Scanner scan = new Scanner(System.in);
  
  System.out.println("------------------------------------------------");
  System.out.println("  Bemvindo ao sistema de consulta de chamados   ");
  System.out.println("------------------------------------------------\n");
  System.out.println("Selecione uma opção para continuar: \n");
  System.out.println("Digite 1 para consultar ");
  System.out.println("Digite 2 para salvar ");
  System.out.println("Digite 3 para carregar ");
  System.out.println("Digite 4 para sair \n");
  
  int opcao = scan.nextInt();
  boolean opcaoValida = true;
  
  	while(opcao == 0 || opcao > 4) {
  		System.out.println("Digite uma opção válida ! \n");
  		opcao = scan.nextInt();		

  	}	

  if(opcao > 0 || opcao <= 4) {	
  	
  		switch(opcao){
  			
  		//Caso 1  - Chama função que recupera os dados do arquivo CSV
  		case 1:
  		{	  
  			//Pede ao usuário para informar o ID do chamado
  			System.out.println("Por favor, informe o ID do chamado: ");
  			
  			//A variavel aqui chama scan2 pois já existe outra variável com o nome scan
  			Scanner scan2 = new Scanner(System.in);	
  			
  			//Pegamos o ID em forma de INT e transformamos em String
  			String chamadoID = Integer.toString(scan2.nextInt());	
  			
  			//Criamos nosso ArrayList
  			List<Chamados> listaChamados = new ArrayList<>();
  			List<Lancamentos> listaLancamentos = new ArrayList<>();
  			
  			//Recebemos o resultado da classe e o armazenamos na ArrayList
  			
  			//Lista e exibe Chamados
  			listaChamados = consultaChamados.lerChamadosCSV(chamadoID, chamadosCSV);
  			consultaChamados.mostraChamados(chamadoID, listaChamados);
  			
  			//Lista e exibe Lancamentos
  			listaLancamentos = consultaLancamentos.lerLancamentosCSV(chamadoID, lancamentosCSV);
  			consultaLancamentos.mostraLancamentos(chamadoID, listaLancamentos);
  			
  			break;
  		}
  			
  		case 2:{
  			//Pede ao usuário para informar o ID do chamado
  			System.out.println("Por favor, informe o ID do chamado: ");
  			
  			//A variavel aqui chama scan2 pois já existe outra variável com o nome scan
  			Scanner scan2 = new Scanner(System.in);	
  			
  			//Pegamos o ID em forma de INT e transformamos em String
  			String chamadoID = Integer.toString(scan2.nextInt());	
  			
  			//Criamos nosso ArrayList
  			List<Chamados> listaChamados = new ArrayList<>();
  			List<Lancamentos> listaLancamentos = new ArrayList<>();
  			
  			//Recebemos o resultado da classe e o armazenamos na ArrayList
  			
  			//Lista e exibe Chamados
  			listaChamados = consultaChamados.lerChamadosCSV(chamadoID, chamadosCSV);
  			
  			//Lista e exibe Lancamentos
  			listaLancamentos = consultaLancamentos.lerLancamentosCSV(chamadoID, lancamentosCSV);
  			
  			/////////////////////////////////////////////////////////////////////////////////
  			
  			//Criamos nosso ArrayList com o resultado da busca e passamos para um novo ArrayList
  			
  			ArrayList<String> ListaConsulta = new ArrayList<String>();
  			ListaConsulta.add(listaChamados.toString());
  			ListaConsulta.add(listaLancamentos.toString());
  			
  			//System.out.println(listaConsulta);
  			
  			//Pede ao usuário para informar o nome do arquivo que será salvo
  			System.out.println("Por favor, informe o nome do arquivo a ser salvo: ");
  			
  			//A variavel aqui chama scan3 pois já existe outra variável com o nome scan2
  			Scanner scan3 = new Scanner(System.in);	
  			
  			//Pegamos o nome do arquivo em forma String
  			String NomeDoArquivo = scan3.nextLine();
  			
  			//Chama a classe que salva o arquivo com o nome que o usuário escolheu
  			SalvaConsulta salvaConsulta = new SalvaConsulta();
  			salvaConsulta.SalvaArquivo(NomeDoArquivo, ListaConsulta);
  			break;
  		}
  			
  		case 3:{
  			System.out.println("Opcao 3 selecionada");
  			break;
  		}
  		
  		case 4:{
  			System.out.println("Obrigado por utilizar minha aplicação, saindo... \n");
  			opcaoValida = false;
  		}
  		
  		default:{
  			System.out.println("Erro desconhecido \n");
  			opcaoValida = false;
  		}
  		
  	}
  }

}
}

image

O arquivo ta vindo em array e não string

T
Solucao aceita

Olá!
Para serializar os dados obtidos das planilhas segue este método.
Precisa completar para obter os lançamentos.

public void serialChamados(String chamadoID, List listaChamados, List listaLancamentos, List listaStatus, String arquivoTXT) {
            ArrayList<String> serialDados = new ArrayList<>();

            for (int i = 0; i < listaChamados.size(); i++) {
                Chamados chamados = (Chamados) listaChamados.get(i);
                if (chamados.getChamadoID().equals(chamadoID)) {
                    ArrayList<String> serialChamados = new ArrayList<>();
                    serialChamados.add(chamados.getChamadoID());
                    serialChamados.add(chamados.getDescricao());
                    serialChamados.add(chamados.getDataAbertura());
                    serialChamados.add(chamados.getCusto());
                    System.out.println("Chamados Serial: " + serialChamados.toString());
                    serialDados.add(serialChamados.toString());
                }
            }

            System.out.println("Dados Serial: " + serialDados.toString());

            try {
                FileOutputStream arquivo = new FileOutputStream(arquivoTXT);
                ObjectOutputStream saida = new ObjectOutputStream(arquivo);
                saida.writeObject(serialDados);
                saida.close();
                arquivo.close();
            } catch (FileNotFoundException ex) {
               ex.printStackTrace();
            } catch (IOException ex) {
               ex.printStackTrace();
            }
        }

Deixei alguns println’s para ver na tela o que ocorre, depois pode remover.

F

A agora sim ficou muito mais claro, eu tava passando pra array pra depois string tava uma loucura, agora está printando.

Agora farei o processo reverso para ler o arquivo e termino

F

Deu certo aqui, terminei só o print que ficou um pouco diferente, mas vou modifica-lo depois , muito obrigado !

Criado 18 de abril de 2019
Ultima resposta 20 de abr. de 2019
Respostas 98
Participantes 2