Bem, estou com algumas dúvidas basicas, quem puder responder, obrigado!
Preciso criar uma descrição pra um objeto. Essa descrição pode ser grande (muitos caracteres). String tem tamanhoMax? Pra essa descrição uso uma String mesmo ou existe algo mais recomendado?
Eu poderia falar em banco de dados, mas quero começar com arquivos. Como faço pra gravar os objetos de minha(s) lista(s) em um arquivo ao encerrar o programa? E ao inicia-lo, ler do arquivo gerado? Não tenho ideia.
StringBuilder é o ideal para quando o texto vai ser bastante alterado, mas creio que o String não tem problemas com o tamanho do texto… Me corrijam se eu estiver errado
E a outra dúvida, para gravar objetos em arquivos, acho que o ideal seria serialização… Dá uma pesquisada por isso, igones!
I
igones
valeu aos 2, vou dar uma pesquisada e qualquer duvidas posto aqui!
I
igones
O que eu estava procurando é isso mesmo, serialização. Porém, eu achei uns tutoriais que ensinam a gravar e depois ler o arquivo e imprimir, eu não quero isso.
Eu quero o seguinte. Ao encerrar o programa gravar as listas em um arquivo ou sei la o que. E quando iniciar o programa, ler o arquivo e mandar os objetos para a lista.
Resumindo quero que nada que inseri se perca ao encerrar.
Alguem tem algum artigo que me ajude a fazer isso?
*Consegui fazer a serialização com objetos criados. Gravei e depois li e imprimi. Porém, não consegui fazer com uma lista, gravando e depois lendo e enviando os objetos do arquivo pra lista.
Abraços!
I
igones
Ufa, consegui. Fiz umas bagaça e acabou funcionando. Só tem 1 problema.
Sempre que inicio o programa mando ler() e quando termino mando gravar(), porém se for a primeira vez que eu for usar, o arquivo vai ta vazio, não sei, só sei que da um erro enorme. Primeiro eu tenho que gravar 1x pra depois eu começar a ler. Fiz uma leitura pra sempre na primeira execução eu não ler o arquivo (só digitar um numero diferente de 1).
- Mas sei que deve ter um metodo ou um jeito que resolva esse erro, alguem sabe? Pode consertar pra mim?
- O que significa o metodo flush()?
Codigo:
packageserializacao2;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.util.ArrayList;importjava.util.Scanner;publicclassExemploStream{// listastaticArrayList<Cliente>lista=newArrayList<Cliente>();staticScannerread=newScanner(System.in);// grava os dadosstaticvoidgravar(){try{//Gera o arquivo para armazenar o objetoFileOutputStreamarquivoGrav=newFileOutputStream("D:\saida.dat");//Classe responsavel por inserir os objetosObjectOutputStreamobjGravar=newObjectOutputStream(arquivoGrav);//Grava o objeto cliente no arquivoobjGravar.writeObject(lista);objGravar.flush();objGravar.close();arquivoGrav.flush();arquivoGrav.close();System.out.println("Objeto gravado com sucesso!");}catch(Exceptione){e.printStackTrace();}}//ler os dadosstaticvoidler(){try{//Carrega o arquivoFileInputStreamarquivoLeitura=newFileInputStream("D:\saida.dat");//Classe responsavel por recuperar os objetos do arquivoObjectInputStreamobjLeitura=newObjectInputStream(arquivoLeitura);lista=(ArrayList<Cliente>)objLeitura.readObject();objLeitura.close();arquivoLeitura.close();}catch(Exceptione){e.printStackTrace();}}staticvoidlistar(){for(Clientec:lista){System.out.println(c.toString());}}publicstaticvoidmain(String[]args){charresp;// SE FOR A PRIMEIRA VEZ QUE EU EXECUTAR O PROGRAMA, NÃO VAI TER NADA PRA LER E VAI DA UM MONTE DE ERRO. COMO RESOLVO ISSO?System.out.println("Digite o char: (1-ler) ");resp=read.next().charAt(0);if(resp=='1'){ler();}System.out.println("Lista no momento:");listar();System.out.println("------------------");do{System.out.println("\nInforme nome: ");Stringnome=read.next();Clientec=newCliente(nome);lista.add(c);System.out.println("Deseja cadastrar outro?");resp=read.next().charAt(0);}while(resp=='s');System.out.println("Lista antes de terminar: ");listar();System.out.println("------------------");gravar();}}
Qual erro que dá quando você tenta ler ele pela primeira vez?
ViniGodoy
O string pode ter no máximo 2.147.483.648 caracteres, o que ocuparia 4GB. Sua descrição vai ser maior que isso? :shock:
ViniGodoy
Altere seu método ler para:
//ler os dados staticvoidler(){try{Filesaida=newFile("D:\saida.dat");if(!file.exists()){lista=newArrayList<Cliente>();return;}//Carrega o arquivo FileInputStreamarquivoLeitura=newFileInputStream(file);//Classe responsavel por recuperar os objetos do arquivo ObjectInputStreamobjLeitura=newObjectInputStream(arquivoLeitura);lista=(ArrayList<Cliente>)objLeitura.readObject();objLeitura.close();arquivoLeitura.close();}catch(Exceptione){e.printStackTrace();}}
Assim, se o arquivo não existir, você simplesmente inicializa uma lista de clientes vazia.
I
igones
Obrigado a todos que me ajudaram. Valeu viniGodoy, agora ta tudo certo!
Abraços!
I
igones
Certo, agora que aprendi o basico, surgiu uma nova duvida.
Em um programa com umas 3-5+ listas interagindo entre si e etc, não complicaria usar serialização não? O que é recomendado para programa mais complexos? Serialização mesmo?
Obrigado! Abraços! :idea:
ViniGodoy
É banco de dados. Só não te sugeriram isso porque você falou que queria começar com arquivos.
I
igones
Entendi, mas é muito complicado começar com banco? Não quis porque tenho essa imagem. Vejo uns tópicos da galera, é uns codigo de conexão gigante kkkk…É dificil assim? Ou só impressão?
Abraços!
wbdsjunior
igones:
Entendi, mas é muito complicado começar com banco? Não quis porque tenho essa imagem. Vejo uns tópicos da galera, é uns codigo de conexão gigante kkkk…É dificil assim? Ou só impressão?
Abraços!
trabalhar com banco de dados (JDBC) é fácil, se você já sabe SQL.
É bem mais fácil usar o banco. Uma consulta, por mais linhas que tome, vai ser muito mais simples do que tentar refazer o mesmo comportamento à mão. Sem falar que a performance de bancos de dados é fantástica, não é à toa que eles ainda são utilizados e, mesmo sendo uma tecnologia que não casa assim tão bem com OO, tem um grande valor.