Ficheiro de Objectos

16 respostas
P

Boas,
Eu tenho um programa com um Applet e tenho um objecto X que tem dois vectores de objectos. Queria guardar o objecto X num ficheiro .dat
Alguém sabe como fazer?

Obrigado

16 Respostas

M

A classe que define o tipo do objeto X deve implementar Serializable e você deve usar um ObjectOutputStream. Mas atenção: por questões de segurança, um applet não pode escrever arquivos localmente (exceto no caso do applet viewer).

P

Como assim? Eu to a fazer um trabalho para marcar registos e tenho um menu no applet. Queria guardar os registos num ficheiro. Podes-me dizer mais ou menos como posso fazer isso? Obrigado

M

Creio que um exemplo ajudará. Supondo que temos a seguinte classe X:

Classe X.java

import java.io.Serializable;
import java.util.ArrayList;

public class X implements Serializable {

	private static final long serialVersionUID = 1L;

	private ArrayList<String> strings;
	private ArrayList<Integer> integers;

	public X() {
		strings = new ArrayList<String>();
		integers = new ArrayList<Integer>();
	}

	public void addString(String s) {
		strings.add(s);
	}

	public void addInteger(Integer i) {
		integers.add(i);
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder(
				(strings.size() + integers.size()) * 3);
		for (String s : strings) {
			sb.append(s);
			sb.append("\n");
		}
		for (Integer i : integers) {
			sb.append(i);
			sb.append("\n");
		}
		return sb.toString();
	}
}

Usaremos duas classes: uma que faz a serialização e outra que faz a desserialização do objeto.

Classe TesteSerialization.java

import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class TesteSerialization {

	private static X x;

	static {
		x = new X();
		for (int i = 0; i < 50; i++) {
			x.addInteger(i);
			x.addString("String " + i);
		}
	}

	public static void main(String[] args) throws Exception {
		ObjectOutputStream oos = null;
		try {
			// cria o arquivo (ficheiro)
			File file = new File("obj.dat");
			// cria o FileOutputStream
			FileOutputStream fos = new FileOutputStream(file);
			// cria o ObjectOutputStream
			oos = new ObjectOutputStream(fos);
			// escreve no arquivo um objeto
			oos.writeObject(x);
			System.out.println("Gravado!");
			
		} finally {
			// fecha
			if (oos != null) {
				oos.close();
			}
		}
	}

}

Classe TesteDeserialization.java

import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class TesteDeserialization {

	public static void main(String[] args) throws Exception {
		ObjectInputStream oos = null;
		try {
			// cria o arquivo (ficheiro)
			File file = new File("obj.dat");
			// cria o FileInputStream
			FileInputStream fos = new FileInputStream(file);
			// cria o ObjectInputStream
			oos = new ObjectInputStream(fos);
			// lê do arquivo
			X x = (X) oos.readObject();
			// imprime o objeto lido
			System.out.println(x);
		} finally {
			// fecha
			if (oos != null) {
				oos.close();
			}
		}
	}
	
}

O problema é que em um applet rodando na Internet, você não pode criar arquivos por questões de segurança (logo, você não poderia fazer a serialização).

P

Obrigado marcobiscaro2112. Tenho uma dúvida, se eu correr o meu programa com o applet no eclipe, os ficheiros funcionam?
Vou testar o código. Depois digo alguma coisa.
Obrigado!

M

No Eclipse sim, pois esse usa o AppletViewer, que não tem restrições de segurança por estar rodando localmente. O código só não funcionará se usado na Web.

P

Nao estou a perceber o que faz isto,

@Override public String toString() { StringBuilder sb = new StringBuilder( (strings.size() + integers.size()) * 3); for (String s : strings) { sb.append(s); sb.append("\n"); } for (Integer i : integers) { sb.append(i); sb.append("\n"); } return sb.toString(); }

Como é que eu escolho se quero gravar o ficheiro ou se quero abrir?

Obrigado

M

Esse método (uma nova implementação do toString()) é apenas uma forma mais elegante de se apresentar o objeto, mas não faz diferença alguma na leitura ou escrita.

Quando ao gravar ou ler, basta olhar o exemplo: temos uma classe que apenas grava e outra que apenas lê. No seu caso, isso poderia ser transformado para métodos. Algo como:

public void gravar(Serializable s) throws Exception {
	ObjectOutputStream oos = null;
	try {
		// cria o arquivo (ficheiro)
		File file = new File("obj.dat");
		// cria o FileOutputStream
		FileOutputStream fos = new FileOutputStream(file);
		// cria o ObjectOutputStream
		oos = new ObjectOutputStream(fos);
		// escreve no arquivo um objeto
		oos.writeObject(s);
	} finally {
		// fecha
		if (oos != null) {
			oos.close();
		}
	}
}

public Object ler(File file) {
	ObjectInputStream oos = null;
	try {
		// cria o FileInputStream
		FileInputStream fos = new FileInputStream(file);
		// cria o ObjectInputStream
		oos = new ObjectInputStream(fos);
		// lê do arquivo
		Object o = oos.readObject();
		return o;
	} finally {
		// fecha
		if (oos != null) {
			oos.close();
		}
	}
	return null;
}

E para usar bastaria fazer:

grava(umObjetoQualquer);

Ou:

Object o = ler(new File("obj.dat"));

Será está mais claro agora?

P

marcobiscaro2112 , não consigo criar e abrir o ficheiro...
nao sei qual o erro....

Minha classe
public class Pessoa {
	protected int idade;
	public Pessoa (){
		idade=10;
		}
}
Meu programa
import java.io.File;
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 Prog {
	public static void main(String[] args) {
		Pessoa pessoa1=new Pessoa();
		
		//criar
		gravar(pessoa1);  
		
		//abrir
		Object o = ler(new File("obj.dat"));  
	}


	public void gravar(Serializable s) throws Exception {   
	    ObjectOutputStream oos = null;   
	    try {   
	        File file = new File("obj.dat");
	        FileOutputStream fos = new FileOutputStream(file);
	        oos = new ObjectOutputStream(fos);
	        oos.writeObject(s);   
	    } finally {    
	        if (oos != null) {   
	            oos.close();   
	        }   
	    }   
	}   
	public Object ler(File file) {   
	    ObjectInputStream oos = null;   
	    try {   
	        FileInputStream fos = new FileInputStream(file); 
	        oos = new ObjectInputStream(fos);
	        Object o = oos.readObject();   
	        return o;   
	    } finally {   
	        if (oos != null) {   
	            oos.close();   
	        }   
	    }   
	    return null;   
	}  
	
}
M

A classe Pessoa deve implementar Serializable para que tudo funcione. Muda a declaração da classe Pessoa para:

public class Pessoa implements Serializable {

E adicione o seguinte atributo nessa classe:

private static final long serialVersionUID = 1L;
P

Já consigo criar o ficheiro! :D

Só mais uma dúvida, qual é o objecto que vai ter o conteúdo do ficheiro? Ou seja.. como é que eu depois apresento o que esta no ficheiro?

Classe:
import java.io.Serializable;

public class Pessoa implements Serializable {
	private static final long serialVersionUID = 1L; 
	protected int idade;
	public Pessoa (){
		idade=10;
		}
	public int getIdade(){
		return idade;
	}
}
Programa:
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.ObjectInputStream;  
import java.io.ObjectOutputStream;  
import java.io.Serializable;  

import javax.swing.JOptionPane;
   
  
public class Prog {  
	public static void main(String[] args) throws Exception {  
        
		int r;
		do{
			r=Integer.parseInt(JOptionPane.showInputDialog("1- criar objecto   2-abrir"));
			if (r==1){
				Pessoa pessoa1=new Pessoa();
				gravar(pessoa1);
			}else if (r==2){
				Object o = ler(new File("obj.dat"));
				
				//System.out.println(o.getIdade());
			
			}else{
				System.out.println("erro");
			}
		}while (r!=0);
       }  
    
    
      public static void gravar(Serializable s) throws Exception {

          ObjectOutputStream oos = null;     
          try {     
               File file = new File("obj.dat");  
               FileOutputStream fos = new FileOutputStream(file);  
               oos = new ObjectOutputStream(fos);  
               oos.writeObject(s);     
           } finally {      
               if (oos != null) {     
                   oos.close();     
                   }     
           }     
       }     
       
      public static Object ler(File file) throws IOException, ClassNotFoundException {     
    	  ObjectInputStream oos = null;     
          try {     
        	  FileInputStream fos = new FileInputStream(file);   
              oos = new ObjectInputStream(fos);  
              Object o = oos.readObject();     
              return o;     
          	} finally {     
               if (oos != null) {     
                   oos.close();     
               }     
           }     
       }    
         
}
M

Para você poder chamar o método getIdade(), declarado na classe Pessoa, você deve ter um objeto desse tipo. Para tanto é preciso transformar um Object em Pessoa. Esse processo é chamado de cast e é feito da seguinte forma (basta substituir a linha comentada por isso):

Pessoa p = (Pessoa) o; // aqui eu faço o cast
System.out.println(p.getIdade()); // e imprimo a idade
P

Obrigado marcobiscaro2112 :smiley:

Cump

P

Só mais uma dúvida…

Vamos imaginar… eu tenho um ficheiro com objectos ja gravado no pc. Depois a correr o programa eu quando volto a chamar o metodo gravar, ele vai apagar o ficheiro existente e criar um novo,
por exemplo…

ficheiro:
obj1
obj2

quando acrescento mais um objecto ele vai apagar ficheiro e gravar o novo obj

ficheiro (novo)
obj3.

ou seja… existe alguma forma de o programa acrescentar objs em vez de os apagar e fazer um novo?

P

Ja ta! :lol: :lol: :lol: :lol: :lol:

P

So mais uma duvida, se eu quiser fazer um menu fica assim?

public class Programa extends Applet{ 
	
	Button a;
	Button b;
	
  public void init (){ 

	  Button a = new Button("nova consulta"); add(a);
	  Button b = new Button("listar consultas"); add(b);
	  
  }

  public boolean action (Event e, Object args){ 
		
		Consultas livro=new Consultas();
		
		Object o = ler(new File("obj.dat"));
		Consultas p = (Consultas) o;
		
		if (e.target == a){
			p.setNovaConsultaE();
			gravar(p);
		}
		
		if (e.target == b){
			p.getListar();
		}
		
	    return true;
	  }
E

alo pdrnvs
disseste que ja tá… podes postar aqui como fizeste?
E uma coisa se tiveres varios objectos no ficheiro como percorres e pegas todos os dados de volta
plz be more clear

Criado 19 de fevereiro de 2009
Ultima resposta 17 de mai. de 2011
Respostas 16
Participantes 3