Salvando em Arquivo

7 respostas
fabiosantanafilho

Prezados(as);

Como segue no cód. abaixo, preciso salvar atributos do objeto PessoaIMC em um arquivo txt [arq.txt].

1- Como faço para salvar um objeto em arquivo?
2- Seria possível utilizar a estrutura try/catch para gravação/leitura dentro de um método e ñ somente no main, como tenho observado? Como?
3- Qual a melhor solução gravação/leitura: dentro dum método o no main mesmo?

Desde já conto com a colaboração e atenção de todos;
Muito Obrigado! :thumbup:

package pessoaimc;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;



/**
 *
 * @author Fabao
 */
public class PessoaIMC extends JFrame implements ActionListener
{
    String nome,
            sexo;

    float peso,
            altura,
            imc;

    JLabel Nome,
            Sexo,
            Peso,
            Altura,
            Imc,
            vazio1,
            vazio2,
            vazio3;

    JButton calcH,
            calcM,
            limpar;

    JTextField _nome,
            _sexo,
            _peso,
            _altura,
            _imc;

    static TextArea text;

    public PessoaIMC()
    {
        this.nome = "";
        this.sexo = "";
        this.altura = 0;
        this.peso = 0;
        this.imc = 0;
    }

    PessoaIMC(PessoaIMC p)
    {
        setTitle("Calculo IMC");
        setSize(350, 225);
        setLocation(50,50);
        getContentPane().setBackground(new Color(100,123,150));
        getContentPane().setLayout(new GridLayout(5,3));

        Nome = new JLabel("Nome: ");
        Nome.setForeground(Color.black);
        Nome.setFont(new Font("",Font.BOLD, 25));

        Sexo = new JLabel("Sexo: ");
        Sexo.setForeground(Color.black);
        Sexo.setFont(new Font ("", Font.BOLD, 25));

        Peso = new JLabel("Peso: ");
        Peso.setForeground(Color.black);
        Peso.setFont(new Font ("", Font.BOLD, 25));

        Altura = new JLabel ("Altura: ");
        Altura.setForeground(Color.black);
        Altura.setFont(new Font ("", Font.BOLD, 25));

        Imc = new JLabel ("IMC");
        Imc.setForeground (Color.yellow);
        Imc.setFont (new Font ("", Font.BOLD, 25));

        vazio1 = new JLabel ("");
        vazio1.setForeground(Color.white);

        vazio2 = new JLabel ("");
        vazio2.setForeground(Color.white);

        vazio3 = new JLabel ("");
        vazio3.setForeground(Color.white);

        _nome = new JTextField();
        _sexo = new JTextField();
        _sexo.setEditable(false);
        _peso = new JTextField();
        _altura = new JTextField();
        _imc = new JTextField();
        _imc.setEditable(false);

        calcH = new JButton ("IMC Homem");
        calcH.addActionListener(this);

        calcM = new JButton ("IMC Mulher");
        calcM.addActionListener (this);

        limpar = new JButton ("LIMPAR");
        limpar.addActionListener(this);
        limpar.setBackground(Color.yellow);
        limpar.setForeground(Color.red);

        text = new TextArea();

        //Formatação do Layout L5xC3
        getContentPane().add(Nome);
        getContentPane().add(_nome);
        getContentPane().add(calcH);

        getContentPane().add(Altura);
        getContentPane().add(_altura);
        getContentPane().add(calcM);

        getContentPane().add(Peso);
        getContentPane().add(_peso);
        getContentPane().add(limpar);

        getContentPane().add(Sexo);
        getContentPane().add(_sexo);
        getContentPane().add(vazio1);

        getContentPane().add(Imc);
        getContentPane().add(_imc);
        getContentPane().add(vazio2);

    }

    public void actionPerformed(ActionEvent e)
    {
        if (e.getSource() == limpar)
        {
            _nome.setText("");
            _sexo.setText("");
            _peso.setText("");
            _altura.setText("");
            _imc.setText("");
            text.setText("");

            return;
        }
        
        try
        {
            this.nome = _nome.getText();
            //this.sexo = _sexo.getText();
            this.peso = Float.parseFloat(_peso.getText());
            this.altura = Float.parseFloat(_altura.getText());

            /**
             * IMC = peso / (altura)²
             *
             * Abaixo do peso:
             * M MAIOR 19,1
             * H MENOR 20,7
             *
             * Peso ideal:
             * Mulheres 19,1 - 25,8
             * Homens 20,7 - 26,4
             *
             * Acima disto considere como obeso.
             */

            this.imc = (float) (this.peso / Math.pow(this.altura,2));

            if(e.getSource() == calcM)
            {
                _sexo.setText("Mulher");
                this.sexo = _sexo.getText();
                
                if (this.imc < 19.1)
                {
                    _imc.setText("Abaixo do Peso! " + this.imc);

                    return;
                }
                else if(this.imc >= 19.1 && this.imc <= 25.8)
                {
                    _imc.setText("Peso Ideal! " + this.imc);

                    return;
                }
                else if(this.imc > 25.8)
                {
                    _imc.setText("Obeso! " + this.imc);

                    return;
                }

            }
            else if (e.getSource() == calcH)
            {
                _sexo.setText("Homem");
                this.sexo = _sexo.getText();
                
                if (this.imc < 19.1)
                {
                    _imc.setText("Abaixo do Peso! " + this.imc);

                    return;
                }
                else if(this.imc >= 19.1 && this.imc <= 25.8)
                {
                    _imc.setText("Peso Ideal! " + this.imc);

                    return;
                }
                else if(this.imc > 25.8)
                {
                    _imc.setText("Obeso! " + this.imc);

                    return;
                }

            }
        }
        catch (NumberFormatException erro)
        {
            _imc.setText("Erro");
            return;
        }

    }

    public static void main(String[] args)
    {
        PessoaIMC pessoa = new PessoaIMC();
        JFrame Janela = new PessoaIMC(pessoa);
        Janela.setVisible(true);

        try
        {
            //Gera o arquivo para armazenar o objeto
            FileOutputStream arquivoGrav = new FileOutputStream("D:/Users/Fabao/IFES/LP1/Projetos NetBeens/Swing/arq.txt");

            //Classe responsavel por inserir os objetos
            ObjectOutputStream objGravar = new ObjectOutputStream(arquivoGrav);

            //Grava o objeto cliente no arquivo
            objGravar.writeObject(pessoa);
            objGravar.flush();
            objGravar.close();
            arquivoGrav.flush();
            arquivoGrav.close();
            System.out.println("Objeto gravado com sucesso!");
            //text.setText("Objeto gravado com sucesso!");
        }
        catch( Exception e )
	{
	    e.printStackTrace( );
	}

        System.out.println("Recuperando objeto: ");
        //text.setText("Recuperando objeto: ");

        try
        {
            //Carrega o arquivo
            FileInputStream arquivoLeitura =
                    new FileInputStream("D:/Users/Fabao/IFES/LP1/Projetos NetBeens/Swing/arq.txt");

            //Classe responsavel por recuperar os objetos do arquivo
            ObjectInputStream objLeitura = new ObjectInputStream(arquivoLeitura);
            System.out.println(objLeitura.readObject());
            //text.setText("" + objLeitura.readObject());
            objLeitura.close();
            arquivoLeitura.close();
        }
        catch( Exception e )
	{
            e.printStackTrace( );
	}

        //para fechar a janela
        Janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

7 Respostas

romarcio

tenta assim na parte de leitura:

try
        {
            //Carrega o arquivo
            FileInputStream arquivoLeitura =
                    new FileInputStream("D:/Users/Fabao/IFES/LP1/Projetos NetBeens/Swing/arq.txt");

            //Classe responsavel por recuperar os objetos do arquivo
            ObjectInputStream objLeitura = new ObjectInputStream(arquivoLeitura);
            //vc utiliza o objeto pessoa para carregar o estado do objeto salvo no arquivo
            pessoa = (PessoaIMC) objLeitura.readObject();
            objLeitura.close();
            arquivoLeitura.close();
        }
        catch( Exception e )
	{
            e.printStackTrace( );
	}
        //para exibir os dados
        System.out.println(pessoa.getNome());
        System.out.println(pessoa.getSexo());
E

tenta usar uma biblioteca para manipular csv (procura se informar sobre o padrão de formato CSV), ou usa o xstream (se o formato for xml)

fabiosantanafilho

por ñ conher essa parada ñ sei como poderia me ajudar! =/
mas vlw a orientção, irei pespquisar! :thumbup:

E

isso vai te dar uma ajuda:

http://tools.ietf.org/html/rfc4180 (especificação)

http://www.guj.com.br/posts/list/124679.java (biblioteca e exemplo de código)

Lembrando que é melhor usar a lib do csv que desenvolver a sua, porque existem casos que a sua lib pode fugir da especificação, e até mesmo falhar na gravação/leitura do arquivo, por alguma característica que você não levou em consideração, por exemplo, um campo String com quebra de linha, vírgula e aspas.

fabiosantanafilho
romarcio:
tenta assim na parte de leitura:
try
        {
            //Carrega o arquivo
            FileInputStream arquivoLeitura =
                    new FileInputStream("D:/Users/Fabao/IFES/LP1/Projetos NetBeens/Swing/arq.txt");

            //Classe responsavel por recuperar os objetos do arquivo
            ObjectInputStream objLeitura = new ObjectInputStream(arquivoLeitura);
            //vc utiliza o objeto pessoa para carregar o estado do objeto salvo no arquivo
            pessoa = (PessoaIMC) objLeitura.readObject();
            objLeitura.close();
            arquivoLeitura.close();
        }
        catch( Exception e )
	{
            e.printStackTrace( );
	}
        //para exibir os dados
        System.out.println(pessoa.getNome());
        System.out.println(pessoa.getSexo());

Pelo q eu entendi, eu ainda tenho q criar os métods getNome e getSexo, ne?!
Num tem nehuma forma realizar a gravação do objeto num arq.txt...???
Outra coisa, será necessário a utilização de um array...???

fabiosantanafilho

evefuji:
isso vai te dar uma ajuda:

http://tools.ietf.org/html/rfc4180 (especificação)

http://www.guj.com.br/posts/list/124679.java (biblioteca e exemplo de código)

Lembrando que é melhor usar a lib do csv que desenvolver a sua, porque existem casos que a sua lib pode fugir da especificação, e até mesmo falhar na gravação/leitura do arquivo, por alguma característica que você não levou em consideração, por exemplo, um campo String com quebra de linha, vírgula e aspas.

Preciso ler/gravar em ‘txt’ (trabalho da facu - LP1). Sendo assim, preciso desenvolver essa temática lendo/gravando num arquivo em txt e ñ em qq outra! =)
Mais uma vez, agradeço mt a orientação! :thumbup:
Vc saberia como fzr isso com um arq txt…???

romarcio

Segue um exemplo básico:

public class Pessoa implements Serializable {

    private String nome;
    private String apelido;
    private int idade;
    private double peso;
    private char sexo;
	
	//getters e setters
	
}

public class TesterSerializable {
    public static void main(String[] args) {
        serializaPessoa();
    }

    private static void serializaPessoa() {
        Pessoa pessoa = new Pessoa();
        pessoa.setApelido("marcinho");
        pessoa.setIdade(10);
        pessoa.setNome("Marcio");
        pessoa.setPeso(25.12);
        pessoa.setSexo('M');

        //serializa
        try {
            FileOutputStream fos = new FileOutputStream("Pessoa.ser");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            //serializa e escreve objeto
            oos.writeObject(pessoa);
            oos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //novo objeto pessoa
        Pessoa newPessoa = new Pessoa();

        //deserializa(leitura do arquivo gravado)
        try {
            FileInputStream fis = new FileInputStream("Pessoa.ser");
            ObjectInputStream ois = new ObjectInputStream(fis);
            //deserializa e lê objeto
            newPessoa = (Pessoa) ois.readObject();
            ois.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        System.out.println("Apelido: " + newPessoa.getApelido());
        System.out.println("Idade: " + newPessoa.getIdade());
        System.out.println("Nome: " + newPessoa.getNome());
        System.out.println("Peso(transient): " + newPessoa.getPeso());
        System.out.println("Sexo: " + newPessoa.getSexo());
    }
}

Os métodos getters e setters de Pessoa, são necessários para poder ler e inserir os dados no objeto.

Criado 22 de outubro de 2010
Ultima resposta 25 de out. de 2010
Respostas 7
Participantes 3