Abrir arquivo salvo!

Olha soh eu fiz uma classe teste para salvar e abrir arquivos.

Soh q deu um branco e eu naum sei continuar

olha soh o nome do arquivo e hora q será salvo e aberto naum é definido pelo usuário eu vou programar o nome do arquivo salvamentos a quando abrir!

Codigo da classe q salva o arquivo:

public class TesteSalvar implements Serializable{

    CadastroDePessoas cdp = new CadastroDePessoas();

    public boolean gravaArquivoBinario()
    {
        try{
            FileOutputStream arq = new FileOutputStream("BackUp");
            ObjectOutputStream os = new ObjectOutputStream(arq);
            os.writeObject(cdp);
        }
        catch(IOException ioe){
            ioe.printStackTrace();
        }
        
        return true;
    }

esse é o metodo de salvar, o de abrir eu nem comecei, alguem pode me dizer o q faço após isso nesse metodo e como começar o de abrir?

vlw galera!

Favor olhar ultima resposta! :wink:

public class TesteSalvar implements Serializable{

    CadastroDePessoas cdp = new CadastroDePessoas();

    public boolean gravaArquivoBinario()
    {
        try{
            ObjectOutputStream objectOut = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(fileName)));              
            objectOut.writeObject(object);
            objectOut.close();
        }
        catch(IOException ioe){
            ioe.printStackTrace();
        }
        
        return true;
    }

só editei com o codigo do seguinte topico:
http://www.guj.com.br/posts/list/139095.java#748337

Só uma coisinha - o que você abriu, tem de fechar SEMPRE. Cadê a chamada ao método close()? O Garbage Collector não faz isso para você tão automaticamente assim. Se largar um arquivo aberto, e o Garbage Collector não tiver oportunidade de rodar completamente pelo menos 2 vezes (o que pode ocorrer nesse seu programa de teste, em que você quase que sai imediatamente do programa) então o arquivo não vai ser salvo corretamente.

Portanto, não se esqueça de chamar close. Chame apenas para a classe mais externa (no seu caso, para ObjectOutputStream), porque os métodos close das classes mais internas (como FileOutputStream) serão chamadas pelo close da classe mais externa.

  1. Sua classe TesteSalvar não precisa implementar Serializable. Quem precisa fazer isso é a classe CadastroDePessoas.

  2. É recomendável deixar a chamada do método close em um bloco finally.

  3. O método não deve retornar sempre true, somente se o arquivo for gravado com sucesso.

  4. Isso é só um teste, certo? Pois serializar um objeto recém criado não faz sentido.

Tipo eu tenho o meu sistema implementado, eu to fazendo esse arquivo para toda vez q eu abrir o sistema eu chamar ele e qdo eu colocar um pessoa la dentro eu atualizar o arquivo sempre abrindo ele novamente!

o .close ta beleza, vou colocar ake!

oh como fico!

[code]public boolean gravaArquivoBinario()
{
FileOutputStream arq = null;
ObjectOutputStream os = null;
try{
arq = new FileOutputStream(“BackUp”);
os = new ObjectOutputStream(arq);
os.writeObject(jan.getCdp());
}
catch(IOException ioe){
ioe.printStackTrace();
}
finally{
try {
os.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}

    return true;
}[/code]

Galera tb preciso usar o metodo

.close()

depois de chamar o metodo que abre o arquivo?

codigo:

[code]public boolean leArquivoBinario()
{
FileInputStream arq = null;
ObjectInputStream is = null;
try {
arq = new FileInputStream(“BackUp”);
is = new ObjectInputStream(arq);
// is.close();

    }
    catch (FileNotFoundException ex) {
        ex.printStackTrace();
    }
    catch(IOException ioe){
        ioe.printStackTrace();
    }

    return true;
}[/code]

A minha duvida é: como eu vou fazer aparecer na tela os dados contidos no arquivo? :?

anyone?

Você deve usar a classe ObjectOutputStream para serializar o objeto em disco. O ObjectInputStream deserializa o que está em disco e você pode usar os métodos que estão na sua classe.

O close() deve ser usado após serializar/deserializar.

O importante é que o Serializable deve ser usado na classe que você pretende gravar em disco.

Tentei montar um exemplo para você entender melhor.

Classe a ser serializada:

[code]package pessoa;

import java.io.Serializable;

public class Pessoa implements Serializable {
private String nome;
private String idade;

public String getIdade() {
    return idade;
}

public void setIdade(String idade) {
    this.idade = idade;
}

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

}[/code]

Classe para realizar a gravação e leitura do disco:

[code]package pessoa;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class TratarArquivo {

public TratarArquivo() {
    Pessoa pessoa = new Pessoa();
    pessoa.setNome("Teste");
    pessoa.setIdade("34");

    //Serializar arquivo
    ObjectOutputStream oos = null;
    try {
        oos = new ObjectOutputStream(new FileOutputStream("Backup"));
        oos.writeObject(pessoa);
    } catch (FileNotFoundException ex) {
        ex.printStackTrace();
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        try {
            oos.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    //Deserializar arquivo
    ObjectInputStream ois = null;
    try {
        ois = new ObjectInputStream(new FileInputStream("Backup"));
        Pessoa novaPessoa = (Pessoa) ois.readObject();
        System.out.println("Nome=" + novaPessoa.getNome());
        System.out.println("Idade=" + novaPessoa.getIdade());
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    } catch (FileNotFoundException ex) {
        ex.printStackTrace();
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        try {
            ois.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

public static void main(String[] args) {
    new TratarArquivo();
}

}[/code]

Se tiver alguma outra dúvida avise.

Abraço

Para mim Deserializar o arquivo só tem akele meio da epoca da pedra, pegando atributo por atributo, não existe algo mais sutil, ou seja, que eu puxe o aquivo e ele jogue na tela os dados, ou parecido :?

[quote=guisantogui]Galera tb preciso usar o metodo

.close()

depois de chamar o metodo que abre o arquivo?
[/quote]
Sim, sempre após ler ou salvar um arquivo feche a conexão.

[quote=guisantogui]codigo:

[code]public boolean leArquivoBinario()
{
FileInputStream arq = null;
ObjectInputStream is = null;
try {
arq = new FileInputStream(“BackUp”);
is = new ObjectInputStream(arq);
// is.close();

    }
    catch (FileNotFoundException ex) {
        ex.printStackTrace();
    }
    catch(IOException ioe){
        ioe.printStackTrace();
    }

    return true;
}[/code][/quote]

De novo: só retorne true se o arquivo foi lido corretamente.

Depende. Você fará da mesma forma que faria se você tivesse um objeto comum na memória (pois após ler do arquivo é exatamente isso o que você tem). Você pode apresentar tudo em uma janela, por exemplo, usando Swing.

Humm, então eu poderia usar a solução do amigo acima, criando um objeto do tipo q eu salvei no arquivo e depois ir iterando e pegando os dados dele?

[quote=guisantogui]Humm, então eu poderia usar a solução do amigo acima, criando um objeto do tipo q eu salvei no arquivo e depois ir iterando e pegando os dados dele?
[/quote]
Exato. Em algum momento do programa você gera o arquivo serializado contendo os objetos. Em outro momento oportuno você lê esse arquivo, resgatando os objetos nele contido. A partir daí, basta fazer como se faria normalmente: iterar pelos objetos necessários, resgatando valores ou fazendo alterações necessários.

Bom jah tenho o caminho, vou ver se consigo percorre-lo, obrigado galera!

Galera, bleza consegui resolver este problema! Õ/

mas faltou um detalhe eu naum tinha testado,

o seguinte no meu aquivo que eu salvei eu salvei um ArrayList e qria obter ele depois, pois eh, para isso eu tinha um metodo em uma das minhas interfaces que lidava com a lista "getCdp"(Cdp = CadastroDePessoas), que retona um ArrayList de Pessoas. Bom jah tenho como pegar os dados da lista que esta no meu programa, mas tenho ainda um problema essa minha lista estou puxando de um arquivo e para coloca-la no programa fiz um metodo "setCdp(CadastroDePessoas cdp)" que iria setar a minha lista que no inicio era vazia, colocando todos os dados do arquivo nela, soh q naum funcionou, vou postar algumas classes abaixo:

Classe que salva e abre arquivos, mas creio que naum seja aqui o erro:

[code]package Classes;

import Interface.JanelaAdicionarNovo;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class TesteSalvar implements Serializable{

JanelaAdicionarNovo jan = new JanelaAdicionarNovo();

public boolean gravaArquivoBinario()
{
    FileOutputStream arq = null;
    ObjectOutputStream os = null;
    
    try{
        arq = new FileOutputStream("BackUp.gss");
        os = new ObjectOutputStream(arq);
        os.writeObject(jan.getCdp());
    }
    catch(IOException ioe){
        ioe.printStackTrace();
    }
    finally{
        try {
            os.close();
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    return true;
}

public boolean leArquivoBinario()
{
    FileInputStream arq = null;
    ObjectInputStream is = null;

    try {
        arq = new FileInputStream("BackUp.gss");
        is = new ObjectInputStream(arq);
        jan.setCdp((CadastroDePessoas) is.readObject());
    }
    catch (FileNotFoundException ex) {
        ex.printStackTrace();
    }
    catch(IOException ioe){
        ioe.printStackTrace();
    }
    catch(ClassNotFoundException cnfe){
        cnfe.printStackTrace();
    }
    finally{
        try {
            is.close();
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    return true;
}

}[/code]

GUI que adiciona pessoa (sem codigo gerado pelo compilador):

[code]package Interface;

import Classes.CadastroDePessoas;
import Classes.GerenciaTabelas;
import Classes.Pessoa;
import Classes.PlainDocument;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.text.MaskFormatter;

public class JanelaAdicionarNovo extends javax.swing.JFrame {

CadastroDePessoas cadastroDePessoas = new CadastroDePessoas();
GerenciaTabelas gerenciaTabelas = new GerenciaTabelas();


public JanelaAdicionarNovo() {
    initComponents();
    this.setTitle("Adicionar Registro");
    txtUF.setText("RS");
    txtCidade.setText("Porto Alegre");
    this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    this.setBounds(20, 20, 1024, 768);
    

    txtFormatDataOrigem.setVisible(false);
    lblDataOrigem.setVisible(false);
    lblDataSemEspacos.setVisible(false);

    MaskFormatter mascaraCpf = null;
    try {
        mascaraCpf = new MaskFormatter("###.###.###-##");
    } catch (ParseException pe) {
        pe.printStackTrace();
    }
    mascaraCpf.setPlaceholderCharacter('_');
    mascaraCpf.setValidCharacters("0123456789");
    mascaraCpf.install(txtFormatCpf);


    MaskFormatter mascaraCnpj = null;
    try{
        mascaraCnpj = new MaskFormatter("##.###.###/####-##");
    }
    catch(ParseException pe){
        pe.printStackTrace();
    }
    mascaraCnpj.setPlaceholderCharacter('_');
    mascaraCnpj.setValidCharacters("0123456789");
    mascaraCnpj.install(txtFormatCnpj);

    MaskFormatter mascaraData = null;
    try {
        mascaraData = new MaskFormatter("##/##/####");
    } catch (ParseException pe) {
        pe.printStackTrace();
    }
    mascaraData.setPlaceholderCharacter('_');
    mascaraData.setValidCharacters("0123456789");
    mascaraData.install(txtFormatDataOrigem);

    MaskFormatter mascaraCep = null;
    try {
        mascaraCep = new MaskFormatter("#####-###");
    }
    catch (ParseException pe) {
        pe.printStackTrace();
    }
    mascaraCep.setPlaceholderCharacter('_');
    mascaraCep.setValidCharacters("0123456789");
    mascaraCep.install(txtFormatCep);
}                       

private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {                                            
    this.dispose();

}

private void btnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {                                             
    if(txtNome.getText().trim().length() == 0){
        JOptionPane.showMessageDialog(rootPane, "O campo nome deve ser preenchido");
    }        
    else{
        String nome = txtNome.getText();
        Pessoa pessoa = new Pessoa(nome);
        cadastroDePessoas.adiciona(pessoa);

        String bairro = txtBairro.getText();
        pessoa.setBairro(bairro);

        String email = txtEmailGeral.getText();
        pessoa.setEmail(email);

        String fone = txtTelefone.getText();
        pessoa.setTelefone(fone);

        String endereco = txtEndereco.getText();
        pessoa.setEndereco(endereco);
       
        String cidade = txtCidade.getText();
        pessoa.setCidade(cidade);

        String uf = txtUF.getText();
        pessoa.setUf(uf);

        String apelido = txtApelido.getText();
        pessoa.setApelido(apelido);

        String homepage = txtHomePage.getText();
        pessoa.setHomepage(homepage);

        String fax = txtFax.getText();
        pessoa.setFax(fax);

        if(txtFormatCep.getText().length() > 0 && txtFormatCep.getText().length() < 8){
            JOptionPane.showMessageDialog(null, "O numero do CEP é inválido");
        }
        else{
            String cep = txtFormatCep.getText();
            pessoa.setCep(cep);
        }

        if(!txtFormatDataOrigem.getText().trim().equals("__/__/____")){
            SimpleDateFormat formatoData = new SimpleDateFormat("dd/MM/yyyy");
            Date agora = new Date();
            Date cal = new Date();

            try {
                 cal = formatoData.parse(txtFormatDataOrigem.getText());
            }
            catch (ParseException ex) {
                JOptionPane.showMessageDialog(rootPane, "Formato da data incorreto", "Erro", JOptionPane.ERROR_MESSAGE);
                return;
            }
           
            // TODO validar meses e dias :/

            if(cal.after(agora)){
                JOptionPane.showMessageDialog(rootPane, "Data inválida", "Cuidado", JOptionPane.WARNING_MESSAGE);
            }
            else{
                pessoa.setDataOrigem(cal);
            }
        }
       
        if(opcCpf.isSelected()){
            if(txtFormatCpf.getText().length() > 0 && txtFormatCpf.getText().length() < 14){
                JOptionPane.showMessageDialog(null, "Campo \"CPF\" não esta preechindo completamente","Cuidado", JOptionPane.WARNING_MESSAGE);
            }
            else{
                String cpf = txtFormatCpf.getText();
                pessoa.setCpf(cpf);
            }
        }
        else if(opcCnpj.isSelected()){
            if(txtFormatCnpj.getText().length() > 0 && txtFormatCnpj.getText().length() < 18){
                JOptionPane.showMessageDialog(null, "Campo \"CPF\" não esta preechindo completamente","Cuidado", JOptionPane.WARNING_MESSAGE);
            }
            else{
                String cnpj = txtFormatCnpj.getText();
                pessoa.setCnpj(cnpj);
            }
        }
        gerenciaTabelas.adicionaPessoa(cadastroDePessoas.ultimaPessoaDaLista().parametroAddTabPessoas());
        JOptionPane.showMessageDialog(null, "Individuo adicionado com sucesso","Parabéns", JOptionPane.PLAIN_MESSAGE);
        this.dispose();
    }
}                                            

private void opcCpfActionPerformed(java.awt.event.ActionEvent evt) {                                       
    if(opcCpf.isSelected()){
        txtFormatCpf.setEnabled(true);
        txtFormatCnpj.setEnabled(false);
        txtFormatCnpj.setText("");
    }
}                                      

private void opcCnpjActionPerformed(java.awt.event.ActionEvent evt) {                                        
    if(opcCnpj.isSelected()){
       txtFormatCnpj.setEnabled(true);
       txtFormatCpf.setEnabled(false);
       txtFormatCpf.setText("");
   }
}                                       

public JFormattedTextField getDataOrigem(){
    return txtFormatDataOrigem;
}

public CadastroDePessoas getCdp(){
    return cadastroDePessoas;
}

public CadastroDePessoas setCdp(CadastroDePessoas cdp){
    return cadastroDePessoas = cdp;
}[/code]

Se tiverem alguma ideia por mais idiota que possa parecer, por favor postem! :wink:

Vlw pela força galera!

Alguma idéia pessoal?

Gente axo q vendo assim o problema esta meio assustador neh!

mas eu acho que o problema esta na hora em que eu tento usar o metodo

setCdp((CadastroDePessoas) is.readObject());

mas naum consegui pensar em nada que possa resolver ou substituir! :?