Java e Orientação a Objetos Java e Orientação a Objetos
Manipulando Arquivos Manipulando Arquivos
de Objetos de Objetos
Prof. Giuliano Prado de Morais Giglio, M.Sc.
A Plataforma Java A Plataforma Java
Programação Orientada a Programação Orientada a
Objetos em Java
Objetos em Java
Criando classe de persistência
Serialização de objetos – interface Serializable Class ObjectOutputStream e ObjectInputStream
Java permite a gravação direta de objetos em disco ou seu envio através da rede.
• Neste caso o objeto deve declarar implementar java.io.Serializable.
Um objeto que implementa a interface
Serializable poderá ser gravado em qualquer stream usando o método writeObject() de
ObjectOutputStream e poderá ser recuperado de qualquer stream usando o método
readObject() de ObjectInputStream.
Criando classe de persistência
Devemos criar duas classes:
• Uma classe para escrita (gravação)
• Uma classe para leitura (recuperação)
Classe ArquivoOut → escrita
Classe ArquivoIn → leitura
Classe ArquivoOut
Interface
Atributos
private FileOutputStream fout = null;
private ObjectOutputStream objOut = null;
Métodos
public void abrir() public void fechar()
public void adicionar(Automovel auto)
Classe ArquivoOut
Implementação
public void abrir() {
fout = new FileOutputStream("ArqAutomoveis.txt");
objOut = new ObjectOutputStream(fout);
}
public void fechar() {
objOut.close();
fout.close();
}
ATENÇÃO
PARA AS
EXCEÇÕES!!!
Classe ArquivoOut
Implementação
public void adicionar (Automovel auto) {
objOut.writeObject(auto);
}
ATENÇÃO
PARA AS
EXCEÇÕES!!!
Classe ArquivoIn
Interface
Atributos
private FileInputStream fin = null;
private ObjectInStream objIn = null;
Métodos
public void abrir() public void fechar()
public Automovel getAutomovel()
Classe ArquivoOut
Implementação
public void abrir() {
fin = new FileInputStream("ArqAutomoveis.txt");
objIn = new ObjectInputStream(fin);
}
public void fechar() {
objIn.close();
fin.close();
}
ATENÇÃO
PARA AS
EXCEÇÕES!!!
Classe ArquivoOut
Implementação
public Automovel getAutomovel () {
return (Automovel)objIn.readObject();
}
ATENÇÃO
PARA AS
EXCEÇÕES!!!
No Formulário de Cadastro
public class frmAutomovel extends javax.swing.JFrame
{
private Automovel auto = null;
private ArquivosOut arq = new ArquivosOu();
public frmAutomovel() { initComponents();
arq.abrir();
...
}
private void btSairActionPerformed
(java.awt.event.ActionEvent evt) {arq.fechar();
...
}
private void btAdicionarActionPerformed
(java.awt.event.ActionEvent evt) {auto = new Automovel(...);
arq.adicionar(auto);
}
ATENÇÃO COM
TRY..CATCH
Criação de um
formulário de consulta
No Formulário de Consulta
public class frmConsulta extends javax.swing.JFrame {
private ArquivosIn arq = new ArquivosIn();
public frmConsulta() { initComponents();
arq.abrir();
...
}
private void formWindowClosing (java.awt.event.WindowEvent evt) { arq.fechar();
}
ATENÇÃO COM
TRY..CATCH
No Formulário de Consulta
private void btVisualActionPerformed (java.awt.event.ActionEvent evt){
boolean continua = true;
Automovel auto = null;
while (continua) {
try {
auto = arq.getAutomovel();
if (auto != null)
tMemo.append(auto.getDados() + "\n\n");
} catch (EOFException ex){
continua = false;
}
catch (IOException ex) { continua = false;
} }
arq.fechar();
}
Testando a aplicação
1. Faça o cadastro de pelo menos 3 objetos;
2. Depois chame o formulário de
Consulta e visualize seus objetos;
3. Confere se todos foram inseridos corretamente;
4. Feche a aplicação;
5. Repita os passos de 1 a 3 e verifique se TODOS os objetos estão inseridos
(os da 1ª e da 2ª execução).
Inserção Múltipla
Como podemos solucionar o problema de se guardar todos os objetos de todos as execuções?
Por que esse problema de persistência
está ocorrendo?
Inserção Múltipla
Passos para uma solução
Crie uma atributo private para uma lista de Automovel na classe de “escrita”;
Faça um método private void Preparar(). Nele:
• Abra o arquivo de dados para leitura;
• Instancie a sua lista;
• Varrer o arquivo até o final, pegando cada um dos seus objetos e inserindo na lista;
• Feche o arquivo no final
Inserção Múltipla
Passos para uma solução
Modifique seu método void abrir():
• Chame o método preparar() antes da abertura dos arquivos;
• Após a abertura, varrer a lista de objetos, gravando no arquivo;
• Quando esta escrita acabar, o arquivo continuará aberto e posicionado para as próximas gravações;
Refaça os passos de testes.
Utilizando JTable para
visualizar os objetos
Mudança no formulário de consulta
jTextArea
jTable
Montagem JTable
← Botão Direito
↑
Propriedades
Operacionalizando JTable
Modifique seu método void getAutomovel():
public Object[ ] getAutomovel() {
SimpleDateFormat formatador = new
SimpleDateFormat ("dd/MM/yyyy");
Object vet[ ] = {placa, modelo,
formatador.format(data_fabri), motor, valor, categoria};
return vet;
}
Crie um método que retorna todos os automóveis do arquivo(ArquivosIn):
public List getTodosAutomoveis()
{
List<Automovel> lista = new ArrayList<Automovel>();
abrir();
boolean continua = true;
Automovel auto = null;
while (continua) {
try {
auto = (Automovel)objIn.readObject();
lista.add(auto);
} catch (EOFException ex){
continua = false;
}
catch (IOException ex) { continua = false;
} catch (ClassNotFoundException ex) { }
}
fechar();
return lista;
}