Você está na página 1de 63

Persistência

Serialização

Cecilia E. Gi
uffra P.
Sobre a aula de hoje
Ø  Objetivo da aula: apresentar conteúdos sobre
persistência de dados e objetos (serialização).
Ø  Metodologia: Aula expositiva, com recursos de
imagem, exemplos e trabalhos práticos em aula
Ø  Textos base: DEITEL, Harvey M.; DEITEL, Paul J.
Java como programar. Porto Alegre: Bookman,
2001. 1202p.

Onde estamos?
Introdução ao desenvolvimento de sistemas reusáveis de software

Conceitos e mecanismos da programação orientada a objetos


Herança e Classes abstratas Diagrama de Bibliotecas de
Objetos e classes Tipos genéricos
Polimorfismo e interfaces classes classes

Técnicas de uso comum em sistemas orientados a objetos


Interface gráfica com o Persistência de dados e
Tratamento de exceções Coleções
usuário objetos (serialização)

Práticas de Desenvolvimento de Software


Introdução a práticas/técnicas de desenvolvimento Construção de sistemas de software que demonstrem as
orientado a objetos características básicas da orientação a objetos.
Introdução
Ø  Dados armazenados em variáveis e arrays são temporários.
Ø  Para retenção de longo prazo dos dados, mesmo depois do
programa ter terminado, os computadores utilizam arquivos.
Ø  Arquivos são armazenados em dispositivos de armazenamento
secundários (ex: discos rígidos).
Ø  Dados persistentes à dados mantidos nos arquivos.
Ø  Existem além da duração da execução do programa.
Ø  Uma linguagem de programação deve ser capaz de processar
arquivos para suportar sistemas que têm quantidades grandes
de dados persistentes
Ø  Fluxo à dados ordenados lidos ou gravados em um arquivo.
Hierarquia de dados
Computadores processam itens de dados como combinações de
zeros e uns.

Bit Menor item de dados em um computador, assume valor 0 ou 1.


(Byte: 8 bits).

Java utiliza caracteres Unicode:


Dígitos, letras e símbolos
- Compostos de dois bytes
especiais.
- Com caracteres para muitos idiomas do
Conjunto de caracteres do mundo.
Caracteres computador representa cada ASCII
caracter como um padrão de - Subconjunto do Unicode
0s e 1s. - Representa maiúsculas e minúsuclas,
dígitos e caracteres especiais comuns.
Hierarquia de dados
Compostos de caracteres ou bytes que transmitem um
Campos significado.

Grupo de campos relacionados (implementado como uma


Registros classe em Java)

Arquivos Grupo de registros relacionados


Hierarquia de dados
Compostos de caracteres ou bytes que transmitem um
Campos significado.

Grupo de campos relacionados (implementado como uma


Registros classe em Java)

Arquivos Grupo de registros relacionados

Itens de dados processados pelos computadores


formam uma hierarquia de dados que se torna
maior e mais complexa a medida que vai
progredindo de bits para caracteres, campos e
assim por diante.
Hierarquia de dados
Um dos campos de cada registro que é escolhido para
Chaves de identificar o registro.
registro A chave é única para cada registro.
Utilizado para classificar e pesquisar registros.

Arquivos Arquivos em que registros são armazenados ordenados


sequenciais pelo campo chave de registro

Sistema de gerenciamento de
bancos de dados (SGBD):
Bancos de Grupo de arquivos
- coleção de programas projetados
dados relacionados. para criar e gerenciar banco de
dados.
Arquivos e fluxos
Ø  Cada arquivo é um fluxo sequencial de bytes
Ø  Cada sistema operacional fornece um mecanismo
para determinar o término de um arquivo
Ø  Marcador de fim de arquivo ou uma contagem do
total de bytes no arquivo que é registrado
Ø  Programa Java que processa fluxo de bytes recebe
indicação do SO quando alcança o fim do fluxo.
Fluxos baseados em bytes e
caracteres
Arquivos criados usando
Fluxos de entrada e fluxos baseados em bytes são
Baseados saída de bytes, arquivos binários: Lidos por
em Bytes representan dados no programas que entendem o
formato binário conteúdo específico e
ordenamento dele.

Fluxos de entrada e Arquivos criados usando


Baseados saída de caracteres para fluxos baseados em
em arquivos, representan caracteres são arquivos de
Caracteres dados como sequência texto: Podem ser lidos por
de caracteres. editores de texto.
Fluxos baseados em bytes e
caracteres
Arquivos criados usando
Fluxos de entrada e fluxos baseados em bytes são
Baseados saída de bytes, arquivos binários: Lidos por
em Bytes representan dados no programas que entendem o
formato binário conteúdo específico e
ordenamento dele.

Fluxos de entrada e
Exemplo: valor 5 armazenado utilizando fluxo baseado em bytes seria
Arquivos criados usando
Baseados armazenado no formato binário do valor numérico 5.
saída de caracteres para fluxos baseados em
em arquivos, representan
caracteres são arquivos de
Caracteres dados como sequência texto: Podem ser lidos por
101 editores de texto.
de caracteres.
Fluxos baseados em bytes e
caracteres
Arquivos criados usando
Exemplo: valor 5 armazenado utilizando fluxo baseado em caracteres
Fluxos de entrada e fluxos baseados em bytes são
seria armazenado no formato binário de caractere 5
Baseados saída de bytes, arquivos binários: Lidos por
00000000 00110101
em Bytes representan dados no programas que entendem o
(representação binária do valor numérico 53, que indica o caractere 5
formato binário conteúdo específico e
em Unicode) ordenamento dele.

Fluxos de entrada e Arquivos criados usando


Baseados saída de caracteres para fluxos baseados em
em arquivos, representan caracteres são arquivos de
Caracteres dados como sequência texto: Podem ser lidos por
de caracteres. editores de texto.
Entrada padrão, saída padrão
e fluxos de erro padrão
Ø  Programa Java abre arquivo criando e associando um
objeto ao fluxo de bytes ou de caracteres.
Ø  Java cria três objetos de fluxo padrão que são associados a
dispositivos quando um programa Java inicia execução e
que podem ser redirecionados

System.in •  Objeto de fluxo de entrada padrão. Permite
ao programa inserir bytes a partir do teclado.

•  Objeto de fluxo de saída padrão. Permite ao


System.out programa enviar a saída dos dados de
caractere para a tela.

•  Objeto de fluxo de erro padrão. Permite ao


System.err programa gerar a saída de mensagem de
erros baseados em caractere na tela.
Entrada padrão, saída padrão
e fluxos de erro padrão
Ø  Programa Java abre arquivo criando e associando um
objeto ao fluxo de bytes ou de caracteres.
Ø  Java cria três objetos de fluxo padrão que são associados a
dispositivos quando um programa Java inicia execução e
que podem ser redirecionados

•  System.in: permite ao programa ler bytes a partir de uma


origem diferente.
•  System.out e System.err: permite que saída seja enviada para
um local diferente, como um arquivo em disco.

Pacote java.io
Ø  Programas Java realizam processamento de arquivo
utilizando classes do java.io que incluem definições para
classes de fluxo
• Para entrada e saída baseada em bytes de
FileInputStream e um arquivo. Herdam de InputStream e
FileOutputStream OutputStream.

FileReader e • Para entrada e saída baseada em caracter


FileWriter de um arquivo. Herdam de Reader e Writer.

Ø  Para entrada e saída de objetos ou variáveis de tipos e


dados primitivos são utilizados os objetos das classes
ObjectInputStream e ObjectOutputStream
Classes Scanner e Formatter
Ø  Além da java.io a entrada e saída baseada em
caracteres pode ser executada com as classes
Scanner e Formatter

•  Para entrada de dados a partir do teclado.


Scanner •  Pode ler dados de um arquivo.

•  Permite que os dados formatados sejam


impressos em qualquer fluxo baseado em
Formatter texto
•  Semelhante ao método System.out.printf
Classe File
Ø  Útil para recuperar informações sobre arquivos ou
diretórios em disco.
Ø  Objetos File não abrem arquivos nem fornecem
capacidades de processamento de arquivos.
Ø  São utilizados com objetos de outras classes java.io
para especificar arquivos ou diretórios a manipular.
Criando objetos File
Ø  Classe File fornece quatro construtores
•  Especifica nome de um arquivo ou diretório para associar com
Com argumento String o objeto file. Nome pode conter informações de caminho
(localização no disco).

•  Especifica um caminho absoluto ou relativo como o primeiro


Com dois argumentos String argumento e o arquivo ou diretório a associar com o objeto File
como o segundo.

•  Utiliza objeto File existente que especifica o diretório pai do


Com argumentos File e String arquivo ou diretório especificado pelo argumento String

Com objeto URI (Uniform •  Especifica nome e localização do arquivo


Resource Identifier)

Caminho absoluto: Contém todos os diretórios desde o raiz que levam a um arquivo ou
diretório específico.
Caminho relativo: normalmente inicia do diretório em que o aplicativo começou a execução.
Métodos File
Método Descrição
boolean canRead() Retorna true se um arquivo for legível pelo aplicativo atual.
boolean canWrite() Retorna true se um arquivo for gravável pelo aplicativo atual.
boolean exists() Retorna true se o arquivo ou diretório representado pelo
objeto File existir.
boolean isFile() Retorna true se o nome especificado como o argumento para o
construtor File for um arquivo.
boolean isDirectory() Retorna true se o nome especificado como o argumento para o
construtor File for um diretório.
boolean isAbsolute() Retorna true se os argumentos especificados para o construtor
File indicarem um caminho absoluto
Métodos File
Método Descrição
String getAbsolutePath() Retorna uma string com o caminho absoluto do arquivo ou
diretório.
String getName() Retorna uma string com o nome do arquivo ou diretório.
String getPath() Retorna uma string com o caminho do arquivo ou diretório.
String getParent() Retorna uma string com o diretório pai do arquivo ou diretório
(diretório em que está localizado).
long length() Retorna o comprimento do arquivo, em bytes. Se o objeto File
representar um diretório, um valor não especificado é retornado.
long lastModified() Retorna uma representação dependente de plataforma da data/hora
em que o arquivo ou diretório for modificado pela última vez. O
valor retornado é útil somente para comparação com outros valores
retornados por esse método.
String[] list() Retorna um array de strings que representam o conteúdo de um
diretório.
Demonstrando
classe File
Demonstrando
classe File
Demonstrando
classe File
Arquivos de texto de acesso
sequencial
Ø  São arquivos nos quais registros são armazenados na
ordem pelo campo de chave de registro.
Ø  Podem ser criados como arquivos de texto ou arquivos
binários

Criando um arquivo de texto de acesso sequencial


Ø  O Java não impõe nenhuma estrutura a um arquivo.
Ø  Registros não fazem parte da linguagem Java.
Ø  O programador deve estruturar os arquivos para
satisfazer os requisitos dos seus sistemas/aplicativos.


Criando um arquivo de texto
de acesso sequencial
Ø  Programa cria arquivo simples de acesso sequencial
que poderia ser utilizado em um sistema de contas a
receber para monitorar valores devidos pelos
clientes a uma empresa
Encapsula informações sobre registro do cliente
Classe
AccountRecord Contém variáveis de instância private account, firstName, lastName
e balance, e métodos set/get para acessá-las
Objeto Formatter gera saída para Strings formatadas.
Pode gerar saída para vários locais (tela ou arquivo)
Classe Declara objeto da
CreateTextFile classe Formatter. Utiliza método format para gravar texto formatado no
arquivo
Utiliza método close para fechar objeto Formatter.
Criando um arquivo de texto
de acesso sequencial
Ø  Possíveis exceções

• Ocorre ao abrir o arquivo utilizando o objeto Formatter,


SecurityException se o usuário não tiver permissão para gravar dados no
arquivo.

• Ocorre ao abrir o arquivo utilizando o objeto Formatter,


FileNotFoundException se o arquivo não puder ser localizado e um novo
arquivo não puder ser criado.

• Ocorre quando uma entrada inválida é lida por um


NoSuchElementException objeto Scanner.

• Ocorre quando é feita uma tentativa de gravar em um


FormatterClosedException arquivo utilizando um objeto Formatter já fechado.
Executando o programa
Lendo dados a partir de um arquivo
de texto de acesso sequencial
Ø  Os dados são armazenados em arquivos de modo que
possam ser recuperados para processamento quando
necessário.
Ø  A classe Scanner pode ser utilizada para inserir
dados a partir de um arquivo em vez de utilizar o
teclado.
Ø  Programa lê registros no arquivo clients.txt criado
previamente e exibe o conteúdo do registro.
Estudo de caso: Programa de
consulta de crédito
Ø  Programas recuperam sequencialmente dados de um
arquivo
Ø  Começando pelo início do arquivo lendo todos os dados
consecutivos até encontrar as informações desejadas.
Ø  Existe possibilidade de precisar processar o arquivo
várias vezes (desde o início) durante a execução do
programa.
Ø  Classe Scanner não permite voltar ao início.
Ø  Precisaria fechar e abrir o arquivo novamente.
Estudo de caso: Programa de
consulta de crédito
Ø  Programa permite ao gerente de crédito obter listas
de clientes
Ø  com saldo zero (que não devem nada à empresa)
Ø  com saldos credores (a empresa deve dinheiro a eles)
Ø  com saldos devedores (devem à empresa)
Ø  Saldo credor é valor monetário negativo e saldo
devedor é valor monetário positivo.
Estudo de caso: Programa de
consulta de crédito
Enumeração Tipo enum define diferentes opções de menu que o usuário terá.
MenuOption

Contém a funcionalidade para o programa de consulta de crédito.

Classe Opção 1: ZERO_BALANCE


Programa exibe menu de texto e
CreditInquiry permite gerente inserir uma de três Opção 2: CREDIT_BALANCE
opções para obter informações de Opção 3: DEBIT_BALANCE
crédito.
Opção 4: END

Informações são coletadas lendo o arquivo clients.txt


Objeto Scanner lê os dados
do arquivo

Objeto AccountRecord
armazena registro sendo
lido a partir do arquivo

Verifica se registro é do
tipo que deve ser mostrado
na tela
Método que determina se o
registro é do tipo adequado










Faz loop até usuário inserir uma
opção válida

Recupera a solicitação inserida
Lê o arquivo e exibe
os registros
adequados
Atualizando arquivos de
acesso sequencial
Ø  Dados em muitos arquivos sequenciais não podem
ser modificados sem o risco de destruir outros dados
no arquivo.
Ø  Exemplo: modificando “Ramos” para “Ribeiro”
Ø  Nome antigo não pode ser sobrescrito porque o novo
nome precisa de mais espaço
Ø  Caracteres além do tamanho do primeiro registro anterior
sobrescreverão o próximo registro.
Ø  Registros em arquivos de acesso sequencial
normalmente não são atualizados no lugar. Em vez
disso, o arquivo inteiro é regravado.
Serialização de objetos
Ø  Em arquivos de texto as informações dos tipos de dados
dos registros são perdidas.
Ø  Exemplo: Lendo o valor 3 ele pode ter vindo de um tipo int,
String ou double.
Ø  No disco temos dados, mas não informações do tipo.
Ø  Serialização de objetos à mecanismo do java
Ø  Objetos serializado à objeto representado como sequencia
de bytes que inclui os dados do objeto, as informações de
tipo do objeto e os tipos dos dados armazenados no objeto.
Ø  Desserialização à Quando o objeto é lido e é recriado na
memória a partir dos dados do arquivo.
Classes e interfaces utilizadas
Classes ObjectInputStream / ObjectOutputStream
•  Implementam as interfaces ObjectInput e ObjectOutput
•  Permitem que objetos inteiros sejam lidos ou gravados em um fluxo
(arquivo)
•  Se inicializam os objetos ObjectInputStream e ObjectOutputStream
com objetos de fluxo que leem e gravam arquivos (classes
FileInputStream e FileOutputStream) à Empacotamento.

Interfaces ObjectOutput / ObjectInput


•  ObjectOutput contém método writeObject que recebe um Object como
argumento e grava suas informações em um OutputStream.
•  Classe que a implementa declara este método e assegura que o objeto
gerado implementa a interface Serializable
•  ObjectInput contém método readObject que lê e retorna uma referência
a um Object a partir de um InputStream
•  Depois do objeto ser lido, pode-se fazer uma coerção (cast) da sua
referência para o tipo real do objeto
Criando um arquivo de acesso
sequencial com serialização
Classe AccountRecordSerializable

•  Implementa interface Serializable para permitir que os


objetos dela sejam seralizados e desserializados com
ObjectOutputStream e ObjectInputStream
•  Interface Serializable é interface de tags. Não
contém método.
•  Uma classe que implementa Serializable é marcada
com tags como um objeto Serializable
•  ObjectOutputStream não enviará para a saída um
objeto que não seja Serializable.
Criando um arquivo de acesso
sequencial com serialização
Ø  Em uma classe que implementa Serializable
Programador deve assegurar que cada variável de
instância seja um tipo Serializable
Ø  Senão, deve declarar como transient que indica que não é
serializable, para ser ignorada no processo de
serialização.
Ø  Por padrão todas as variáveis de tipo primitivo são
serializáveis (char, double, int, boolean etc).
Interface Serializable
especifica que objetos
AccountRecordSerializable
podem ser gravados em um
arquivo
Abre arquivo clients.ser
para gravar
Cria AccountRecord com base
na entrada do usuário

Grava objeto de registro


no arquivo
Lendo e desserializando dados a partir
de um arquivo de acesso sequencial
Ø  Objetos em arquivos gravados com objeto
ObjectOutputStream devem ser lidos do arquivo no
mesmo formato que foram gravados.
Ø  Utiliza-se ObjectInputStream empacotado em um
FileInputStream.
Abre arquivo clients.ser
para leitura

Lê o registro a partir do
arquivo

Mostra as informação do
registro
Classes java.io adicionais
Classes
Classes abstract que declaram os métodos para realizar entrada e saída
InputStream baseada em bytes.
OutputStream

Classes
PipedInputStream Estabelecem pipes entre dois threads em um programa.
PipedOutputStream
Pipes são canais de comunicação sincronizados entre threads.
Classes
FilterInputStream Fornecem funcionalidade adicional ao fluxo, como agregar bytes de dados a
FilterOutputStream unidades de tipo primitivo significativas.

Classe
Gera a saída de texto para um fluxo especificado.
PrintStream
Interfaces Para leitura e gravação de tipos primitivos em um arquivo.
DataInput
DataOutput DataInput é implementada pelas classes RandomAccessFilese DataInputStream;

DataOutput é implementada por RandomAccessFilee DataOuputStream.


Classe
SequenceInputStream permite a concatenação de vários InputStreams

o programa vê o grupo como um InputStream contínuo.


Interfaces e classes para entrada e
saída baseada em caracteres
Classes abstratas
Reader e Writer Unicode de dois bytes, fluxos baseados em caracteres.

Classes
BufferedReader e Permitem armazenamento em buffer de fluxos baseados em
BufferedWriter: caracteres.
Classes
CharArrayReader e Lêem e gravam fluxos de caracteres em arrays de caracteres.
CharArrayWriter:

Classe
LineNumberReader: Fluxo de caracteres armazenado em buffer que monitora o
número de leitura de linhas.
Classes PipedReader
e PipedWriter: Implementam fluxos de caracteres redirecionados que podem ser
utilizados para transferir informações entre threads.
Classes StringReader
e StringWriter: Lêem caracteres e gravam caracteres em Strings.
Abrindo arquivos com
JFileChooser
Ø  Classe JFileChooser exibe caixa de diálogo que
permite ao usuário selecionar arquivos ou diretórios.

Exemplo utilizado: FileDemonstration


Ø  Adicionada interface gráfica
Ø  Exibe os mesmos dados
Ø  Construtor chama método analyzePath que chama o
getFile para recuperar objeto File
Construtor configura o
Frame

Permite que usuário


selecione arquivos ou
diretórios

Exibe diálogo

Recupera arquivo ou
diretório selecionado
chama o
getFileOrDirectory
para recuperar
objeto File

Exibe informações
sobre o arquivo
Exercício
Ø  Faça um programa que permita ao usuário inserir produtos
Ø  Crie uma classe que guarde dados de produtos com as seguintes
informações
Ø  Código
Ø  Nome
Ø  Preço
Ø  Ano de fabricação
Ø  Crie o arquivo “produtos.txt” com as informações inseridas
Ø  Crie um arquivo para ler as informações de “produtos.txt”
Ø  Faça a versão serializável
Ø  Faça a versão com interface gráfica
Exercício
Ø  Faça um programa que copie o conteúdo de um arquivo para outro.
Ø  Uma loja possui 4 filiais, cada uma com um código de 1 a 4. Um arquivo contendo as
vendas diárias feitas nas quatro filiais é gerado a partir de uma planilha. Cada linha
do arquivo contém o número da filial e o valor de uma venda efetuada, separados por
vírgula. Ex.:
Ø  1,189.90
Ø  1,45.70
Ø  3,29.90
Ø  4,55.00
Ø  No exemplo, a filial 1 fez duas vendas. A filial 3 fez uma venda e a 4 também uma.
Faça um programa que leia este arquivo e informe, ao final, o total e a média das
vendas de cada filial.
Ø  Faça um programa que liste o conteúdo da raiz do seu disco (ou um diretório
qualquer) e informe, para cada item, se é um arquivo ou se é um diretório.
Ø  Faça um programa que leia nomes, idades e alturas de várias pessoas e armazene em
um arquio. Em seguida, leia o arquivo e armazene em uma lista, e imprima o
conteúdo desta lista ordenado por nome, depois ordenado por idade e por fim
ordenado por altura.

Você também pode gostar