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
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!
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
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