• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

nakuro

Ficheiros

13 mensagens neste tópico

Estou a tentar gravar informação em ficheiros e não tou a conseguir, primeiro é construir um metodo que recebe como parametro o nome do ficheiro e guardar toda a informação do objecto (neste caso cd) num ficheiro de texto.E depois ler o que esta la.

A outra duvida e como gravar um objecto num ficheiro e depois conseguir extrair a informação.

Ja tentei de varias maneiras mas isto não resulta :wallbash:

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Dava jeito que fosses mais explicito, de que maneiras tentaste?, que código estás a usar?, que tipo de dados estás a gravar?, para onde os queres gravar?

Para gravares um objecto tens de usar serialização. O teu objecto tem de implementar a interface Serializable, depois basta usares os métodos write/read object de uma ObjectOutputStream. O seguinte código deve ser suficiente para guardar o objecto que pretendes...

    public void saveFile(File saveFile) {
        FileOutputStream f = null;
        try {
            ObjectOutputStream o = new ObjectOutputStream(f = new FileOutputStream(saveFile));
            o.writeObject(this);//Guardar o proprio objecto.
        } catch (IOException ex) {
            ex.printStackTrace();//incluir codigo para tratar erros
        } finally {
            if (f != null)
                try {
                    f.close();
                } catch (IOException ex) {
                     ex.printStackTrace();//incluir codigo para tratar erros
                }
        }
    }

Se quiseres um método que receba uma String com o nome do ficheiro em vez de receber já o ficheiro podes fazer:

    public void save(String filename) {
        save(new File(filename));
    }

Esqueci-me do método para voltar a abrir :P

Este não é tão genérico uma vez que vai devolver uma instância do objecto que foi guardado.

Substitui <tipo do objecto> pelo objecto que queres ler.

    public static <tipo do objecto> load(File openFile) {
        <tipo do objecto> objectoLido = null;
        FileInputStream f = null;
        try {
            ObjectInputStream i = new ObjectInputStream(f = new FileInputStream(openFile));
            objectoLido = (<tipo do objecto>) i.readObject();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();//incluir codigo para tratar erros
        } catch (IOException ex) {
            ex.printStackTrace();//incluir codigo para tratar erros
        } finally {
            if (f != null)
                try {
                    f.close();
                } catch (IOException ex) {
                    ex.printStackTrace();//incluir codigo para tratar erros
                }
            return <tipo do objecto>;
        }
    }
[code]

É claro que não precisas retomar o objecto, podes simplesmente aceder aos seus campos. Os métodos são o mais genéricos possível, não têm código de validação do objecto lido, por exemplo. Mas funcionam 

[/code]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

PrinteWriter out = new PrintWriter(new FileWriter(filename));
out.println(o.nome);
out.println(o.numero);
out.flush();
out.close();

Simples :P

Desta forma cada vez que abres o ficheiro ele é apagado se quiseres guardar dados sem apagar os que já la estão então metes.

PrinteWriter out = new PrintWriter(new FileWriter(filename,true));

Espero ter ajudado.

Cumps Magician :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Foi uma grande ajuda mas ta-me aqui a dar um erro :-[

Classe BibliotecaMultimedia

metodos:

public void gravar_dados_objecto (String nome) throws IOException
 {
   FileOutputStream f = null;
   try {
         ObjectOutputStream o = new ObjectOutputStream(f = new FileOutputStream(nome));
         o.writeObject(this);//Guardar o proprio objecto.
        } catch (IOException ex) {
            System.out.println ("impossivel abrir ficheiro");
        } 
             
        f.close();
    }
    
    public BibliotecaMultimedia carregar () throws IOException
    {
       BibliotecaMultimedia o=null;
       try{
        ObjectInputStream i=new ObjectInputStream (new FileInputStream("teste"));
        o = (BibliotecaMultimedia) i.readObject();
        }
        catch (ClassNotFoundException ex)
        {
           System.out.println ("impossivel carregar");
        }
        catch (IOException exc)
        {
           System.out.println ("impossivel carregar2");
        }
        return o;
    }

  depois quando crio uma instancia da classe Bibliotecamultimedia e adiciono la um cd,gravo,  carrego,  depois de receber o objecto retornado

Biblioteca temp= (BibliotecaMultimedia) bb.carregar();

quando faço por exemplo: temp.get_cds () que e um metodo que devolve o numero de cds da um erro do tipo: IOEXception

Alias na descrição do erro diz-me que o objecto ao qual estou a tentar aceder o metodo esta null.

Provavelmente deve ser um erro de gravação

Nota: o nome do ficheiro esta correcto, ou seja o que gravou e o mesmo que carrega.

cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A tua classe BibliotecaMultimedia implementa a interface Serializable? É que, apesar de algumas coisas menos bem, o código está correcto.

Tenho-o até a compilar :)

Deve faltar ai um

BibliotecaMultimedia implements Serializable

...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

neps tem implementado serializable, ja agora coloco as duas principais classes:

classe BibliotecaMultimedia

import java.util.*;
import java.io.*;
public class BibliotecaMultimedia implements Serializable
{
Map<String, ItemMultimedia> lista= new HashMap<String, ItemMultimedia> ();
int soma=0;
int conta_cd, conta_dvd, conta_alta;
public BibliotecaMultimedia ()
{
}

public void add_elemento (ItemMultimedia item) //adiciona um qualquer item multimedia
{
    lista.put (item.get_titulo(), item);
}

public ItemMultimedia listar_item (String titulo) // lista pela chave
{
    return lista.get (titulo);
}
public void gravar_dados_objecto (String nome) throws IOException
 {
   FileOutputStream f = null;
   try {
         ObjectOutputStream o = new ObjectOutputStream(f = new FileOutputStream("teste"));
         o.writeObject(this);//Guardar o proprio objecto.
        } catch (IOException ex) {
            System.out.println ("impossivel abrir ficheiro");
        } 
             
        f.close();
    }
    
    public BibliotecaMultimedia carregar () throws IOException
    {
       BibliotecaMultimedia o=null;
       FileInputStream f=null;
       try{
        ObjectInputStream i=new ObjectInputStream (f=new FileInputStream("teste"));
        o = (BibliotecaMultimedia) i.readObject();
        }
        catch (ClassNotFoundException ex)
        {
           System.out.println ("impossivel carregar");
        }
        catch (IOException exc)
        {
           System.out.println ("impossivel carregar2");
        }
        f.close();
        return o;
    }  
   public int get_num_cd ()
    {
        return conta_cd;
    }

classe main

import java.util.*;
import java.io.*;

public class Main implements  Serializable
{
public static void main (String[]args) throws IOException
{
    String nome=null;
    String autor=null;
    BibliotecaMultimedia bb= new BibliotecaMultimedia();
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
             do
    {
        System.out.println ("introduza o nome do cd: ");       
        nome= br.readLine ();
    
        System.out.println ("introduza o autor: ");
        autor= br.readLine();
   
        CD cd=new CD(nome, autor);//cria o cd
        bb.add_elemento (cd);//adiciona-o
        System.out.println ("prima 1 para continuar ou 0 para parar ");
    }while (br.readLine().compareTo("0")!= 0);
           bb.gravar_dados_objecto ("teste");//testar ficheiros de objectos
    BibliotecaMultimedia tf =(BibliotecaMultimedia) bb.carregar ();
    
    System.out.println ("testar ficheiros de objectos");
    System.out.println (tf.get_num_cd ());// aqui da o erro referido acima 

não e o codigo todo mas uma boa parte, o erro e:java.lang.NullPointerException

at Main.main(Main.java:63)

cumprimentos e obrigado pela ajuda

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vou tentar ver isso no intervalo da aula, pelas 16:00....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já pensas-te em usar um BD ?

Acho que essa politica de guardar os valores e depois reconstruir os objectos não me parece muito eficaz :S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não quero desviar muito o assunto mas a

politica de guardar os valores e depois reconstruir os objectos
é bastante eficaz. Usar uma base de dados para guardar meia dúzia, ou mesmo centenas ;), de dados pode não ser o melhor. É claro que depende do tipo de dados a guardar mas a serialização é um sistema simples, prático e rápido de guardar dados.

Parece que faltam algumas classes e algum código... é complicado sem estar a correr o mesmo código que tu e à primeira vista encontrar um objecto que esteja a null. Usa as funções de debug do IDE que estás a usar, coloca um break point, pelo menos, na linha antes do erro e verifica o que se passa. Por outro lado não é só o objecto BibliotecaMultimedia que tem de implementar a interface Serializable. Ao serializares um objecto, todas as referências para outros objectos vão levar a que esses objectos também seja serializados, assim a classe ItemMultimedia também tem de implementar a interface.

Se puderes colocar o código completo ou colocar mais informações sobre a estruturas das classes pode ser que possamos encontrar erros mais facilmente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O ja descobri os erros, um era uma classe que não tinha serializable e faltava-me tambem em algumas classes importar o java.io.

Ja agora em relação as bd, eu vou começar a desenvolver um trabalho ainda me vai dar que suar, e estava a pensar usar base de dados em acess, o trabalho não sera um trabalho muito extenso mas ja vai ter uma quantidade interessante de dados (pelo menos para mim que ainda sou noob nisto). Ou seja e um trabalho tipico de fim de semestre da uni.

Que sistema de guardar dados me aconçelham?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

HSQLDB ;)

É o que recomendo sempre mas depende do que queres, access pode ser suficiente. Mas estamos a falar de Java certo? O software que vais desenvolver é em Java? Se assim for, http://hsqldb.org é um bom motor. Se quiseres podes usar outro qualquer, mysql, oracle, access, etc, basta teres um driver JDBC para o motor que queres.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim é em java. A construção e ligação desse tipo de base de dados não e muito complexo?

Pelo que sei o acess e suficiente para aquilo que vou fazer mas claro se poder incluir algo melhor e sempre mais valorizado:)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se usares access tens o problema de encontrar um driver JDBC para acederes do teu código Java à base de dados, não sei se existe algum, nunca procurei, mas deve existir. Se usares o HSQLDB já tens um driver incluido e o motor é simples de se trabalhar, na verdade fazes tudo em Java por isso não terás que aprender quase nada de novo.

Já estamos a fugir um pouco ao tópico, se quiseres existem outros tópicos na secção de Java sobre o HSQLDB, se não vires as tuas dúvidas resolvidas cria um tópico novo ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora