Ler Objetos em Arquivo txt

15 respostas
T

Pessoal quando vou ler um arquivo de objetos, o primeiro eh lido normalmente, soh q qdo o loop volta(repeti) ocorre esse erro “invalid type code: AC” e nao le o objeto…

alguém poderia ajudar???

Fonte do método
public void le_arq() {

StringBuffer buffer = new StringBuffer();

ObjectInputStream in = null;

CadCanais canal_aux = new CadCanais();
try{

in = new ObjectInputStream(new FileInputStream(nome_arq));

while(true){

canal_aux = (CadCanais)in.readObject();

buffer.append(canal_aux.getNome()+"/ “);

buffer.append(canal_aux.getNumero()+”/ “);

buffer.append(canal_aux.getFiliacao());

buffer.append(canal_aux.getFlag());

buffer.append(”\n");

System.out.println(canal_aux.getNome());

}

}catch(EOFException ex){

JOptionPane.showMessageDialog(null,Fim do Arquivo+ ex.getMessage());

}catch(ClassNotFoundException ex){

JOptionPane.showMessageDialog(null,"Nao foi possivel carregar o Objeto "+ ex.getMessage());

}catch(IOException erro){

JOptionPane.showMessageDialog(null,erro.getMessage());

}
jtTexto.setText(buffer.toString());

try {

in.close();

} catch (IOException ex) {

JOptionPane.showMessageDialog(null,"Erro no Ecenerramento do Arquivo "+ex.getMessage());

}

}

15 Respostas

D

o objeto que vc coloca no txt é Serializable e como você esta salvando no arquivo ?

T

eh Serializable sim… estou salvando com o ObjectOutputStream, está salvando corretamente, o problema eh na hora de carregar do arquivo

M

Mas como voce salva varios?
Só vai jogando no arquivo?

Acho que a melhor opção seria salvar uma ArrayList e para ler a mesma coisa.

T

To salvando num ArrayList e depois mando pro aqruivo num ‘‘for’’, um objeto de cada vez…

Qdo carrego faço o processo inverso… pego do arquivo e vou jogando na lista, mas soh pega o primeiro e da o msm erro

T

Você não pode usar um ObjectInputStream/ObjectOutputStream em um arquivo texto (ou seja, aberto com FileWriter/FileReader). O arquivo tem de ser binário (aberto com FileInputStream/FileOutputStream. ).

M

Esse é o problema… mande gravar a lista invés de iterar e gravar cada objeto.

Lista é serializavel então voce pode mandar ela com objetos serializaveis.

@thingol
Ele já esta abrindo com o FileImputStream.

T

thingol:
Você não pode usar um ObjectInputStream/ObjectOutputStream em um arquivo texto (ou seja, aberto com FileWriter/FileReader). O arquivo tem de ser binário (aberto com FileInputStream/FileOutputStream. ).

ja to abrindo com FileInputStream, o arquivo eh TXT, mas isso realmente influencia?? testei com .DAT e ocorreu a msm coisa…

Mark_Ameba
Vou testar o q vc disse!!!

Obrigado a todos pelas respostas, se alguém tiver mais idéias, podem lança-lás!!!

T

Como é que esses objetos foram gravados? Se por algum motivo esses objetos foram gravados em um arquivo-texto (usando FileWriter ou coisa parecida) então um abraço, porque foram corrompidos.

T

Bom, para gravar to usando ‘‘ObjectOutputStream arquivo = new ObjectOutputStream(new FileOutputStream(new File(nome_arq),true));’’… se está errado qual a maneira correta para não corromper?

T

Fonte do método de inserção… insiro primeiro na lista depois passo p arquivo…

public void add_lista(){

        CadCanais canal = new CadCanais();
            
        if(jtNome.getText().equals("")||jtNumero.getText().equals("")||jtFiliacao.getText().equals("")){
            JOptionPane.showMessageDialog(null, "Por favor, preencha todos os campos!!");
        }else{

            canal.setNome(jtNome.getText());
            try{
                canal.setNumero(Integer.parseInt(jtNumero.getText()));
            }catch(NumberFormatException ex){
                JOptionPane.showMessageDialog(null, "Formato de número errado!!");
            }
            canal.setFiliacao(jtFiliacao.getText());
            canal.setFlag('x');
            System.out.println("ok");
            telaprincipal.canais.add(canal);
            System.out.println("ok");
            grava_arq();
            dispose();

        }
    }

    public void grava_arq(){
        try {
            ObjectOutputStream arquivo = new ObjectOutputStream(new FileOutputStream(new File(nome_arq),true));
            for (int i = 0; i < telaprincipal.canais.size(); i++) {
                arquivo.writeObject(telaprincipal.canais.get(i));
                System.out.println(telaprincipal.canais.get(i).getNome());
            }
            arquivo.flush();
            arquivo.close();

        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
        System.out.println("ok");
    }
M

Frave a lista direto

public void grava_arq(){
try {
ObjectOutputStream arquivo = new ObjectOutputStream(new FileOutputStream(new File(nome_arq)));
arquivo.writeObject(telaprincipal.canais);
arquivo.flush();
arquivo.close();

} catch (IOException ex) {
JOptionPane.showMessageDialog(null, ex.getMessage());
}
System.out.println("ok");
}

E para ler invés de usar um iterador e tentar ler um a um voce pode fazer algo parecido com isso.

public void grava_arq(){
try {
ObjectInputStream arquivo = new ObjectInputStream(new FileInputStream(new File(nome_arq)));
telaprincipal.canais = arquivo.readObject();
arquivo.flush();
arquivo.close();

} catch (IOException ex) {
JOptionPane.showMessageDialog(null, ex.getMessage());
}
System.out.println("ok");
}
T

Realmente resolvi usando um ArrayList, ou seja, no arquivo gravo somente o array e nao cada posição separada… para ler a msm coisa carrego o array e pronto fica blz!!!

Obrigado a todos pelas dicas, se alguém tiver mais a acrescentar fique avontade!!!

M

Se voce quisesse edita-los manualmente voce poderia usar o JFileHelper que é legal para se trabalhar com dados em arquivo texto com tamanho predefenidos de colunas ou então com delimitadores.

http://www.jfilehelpers.com

Outra opção seria usar uma API como o XStream para salvar em XML a lista.

T

Mark_Ameba:
Se voce quisesse edita-los manualmente voce poderia usar o JFileHelper que é legal para se trabalhar com dados em arquivo texto com tamanho predefenidos de colunas ou então com delimitadores.

http://www.jfilehelpers.com

Outra opção seria usar uma API como o XStream para salvar em XML a lista.

Vou da uma olhada no JFileHelper, nunca tinha visto… sobre o XStream ja tinha lido a respeito, e se nada tivesse dados certo e fazer com ele…

Vlw

M

Conheci esse JFileHelper a pouco tempo em algum tópico aqui do GUJ.

Criado 5 de abril de 2009
Ultima resposta 8 de abr. de 2009
Respostas 15
Participantes 4