[quote=drsmachado]Sei que o tópico está marcado como resolvido, mas, há cerca de um mês eu desenvolvi um trabalho para um amigo, cujo objetivo era utilizar o FileInputStream e o FileOutputStream.
Desta forma, utilizei o seguinte código, pois o mesmo atendia os requisitos propostos pelo problema, que era para gravar objetos de classes que posteriormente seriam recuperados e utilizados em cálculos estatísticos.
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
public class gravaObj {
FileOutputStream fos;
ObjectOutputStream oos;
Object obj;
List ll;
public void serializa(Object obj, String arq) {
try {
File ff = new File(arq);
if (ff.exists()) {
leObj lo = new leObj();
ll = (ArrayList) lo.le(arq);
ll.add(obj);
} else {
ll = new ArrayList();
ll.add(obj);
}
fos = new FileOutputStream(ff, false);
oos = new ObjectOutputStream(fos);
oos.writeObject(ll);
oos.flush();
oos.close();
fos.close();
} catch (IOException ioe) {
System.out.println(ioe.getMessage());
}
}
}
Na época até cheguei a colocar no GUJ uma pergunta sobre como ler mais de um objeto gravado, pois o FileInputStream não possui um método como o nextLine() da classe Scanner.
O mesmo permite perfeitamente a inclusão de vários objetos e, esta classe faz a leitura destas sem qualquer perda (desconsiderando performance, é claro)
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.List;
public class leObj {
List lista = new ArrayList();
FileInputStream fis;
ObjectInputStream ois;
public List le(String arq) {
try {
fis = new FileInputStream(arq);
ois = new ObjectInputStream(fis);
lista = (ArrayList) ois.readObject();
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
}finally{
return lista;
}
}
}
Como podem observar, os códigos não ficaram tão elegantes como poderiam, mas se efetuarem um teste simples, verão que são extremamente funcionais.
Classe dos objetos a serem serializados
import java.io.Serializable;
public class Obj implements Serializable {
int cod;
String nome;
public int getCod() {
return cod;
}
public void setCod(int cod) {
this.cod = cod;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
Classe de teste
import java.util.List;
import javax.swing.JOptionPane;
import util.gravaObj;
import util.leObj;
public class Teste {
public static void main(String[] args) {
int x=0;
Obj obs = new Obj();
do{
obs.setCod(Integer.parseInt(JOptionPane.showInputDialog("Código ")));
obs.setNome(JOptionPane.showInputDialog("Nome "));
gravaObj go = new gravaObj();
go.serializa(obs, "C:\\arq1.com");
x = Integer.parseInt(JOptionPane.showInputDialog("Deseja continuar (1) Sim (0) Não"));
}while(x != 0);
leObj lo = new leObj();
List l = lo.le("C:\\arq1.com");
for(int y = 0; y < l.size(); y++){
Obj t = (Obj)l.get(y);
System.out.println(y+" "+t.getCod()+" "+t.getNome());
}
}
}
É uma alternativa.
[/quote]
Nossa, me ajudou e muito, daqui a alguns dias eu ia programar cálculos “doidos” como estes e muito obrigado, ajudou e muito para coisas futuras que irei ter de fazer…