Ficheiro de Objectos

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

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).

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

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).

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!

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.

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

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?

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

[code]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;   
}  

}[/code]

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;

Já consigo criar o ficheiro! :smiley:

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:

[code]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;
}
}[/code]

Programa:

[code]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();     
           }     
       }     
   }    

} [/code]

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

Obrigado marcobiscaro2112 :smiley:

Cump

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?

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

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

[code]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;
  }

[/code]

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