Arquivos, fluxos e
serialização de objetos
Sistemas de Informação
Prof. Vinicius Cardoso Garcia
vcg@cin.ufpe.br
Licença do Material
Este Trabalho foi licenciado com uma Licença
CreaKve Commons -‐ Atribuição-‐NãoComercial-‐
ComparKlhaIgual 3.0 Não Adaptada
.
Mais informações visite
LogísKca
• Apresentação do professor
• Material
• Dúvidas? Interrompam a vontade...
• Celulares silenciosos
ObjeKvos
• O que são arquivos e como usá-‐los
– Criação, leitura e gravação
• Recuperação de informações sobre arquivos e diretórios
• Hierarquia de classes para fluxo de E/S • Arquivos texto vs Arquivos Binários
• U>lização das Classes
– Scanner e Forma:er para processar arquivos texto – FileInputStream e FileOutputStream para leitura e
gravação
Introdução
• Dados armazenados em variáveis e arrays são
temporários. São perdidos quando uma variável local sai do escopo ou quando o programa termina.
• Para retenção de longo prazo dos dados, os computadores podem u>lizar arquivos.
• Os computadores armazenam os arquivos em
disposiKvos de armazenamento secundários, como discos rígidos, discos óp>cos, unidades flash e fitas magné>cas.
• Os dados man>dos nos arquivos são dados
persistentes porque existem além da duração da execução do programa.
Hierarquia de dados
• Em úl>ma instância, um computador processa todos os itens de dados como combinações de zeros e uns.
• É simples e econômico para os engenheiros
construírem disposi>vos eletrônicos que podem
assumir dois estados estáveis — um representando 0 e o outro representando 1.
• O menor item de dados em um computador pode assumir o valor 0 ou o valor 1.
• Esse item de dados é chamado bit. Abreviação de “binary digit” — um dígito que pode assumir um de
Hierarquia de dados
• Os programadores preferem trabalhar com dígitos
decimais (0–9), letras (A–Z e a–z), e símbolos especiais
(por exemplo, $, @, %, &, *, (,), –, +, ", :, ? e / ). Conhecidos como caracteres.
– Conjunto de caracteres é o conjunto de todos os caracteres
u>lizado para escrever programas e representar itens de dados.
• O Java u>liza caracteres Unicode que são compostos de
dois bytes, cada qual composto de oito bits
• O >po byte do Java pode ser u>lizado para representar dados em bytes.
• O Unicode contém caracteres para muitos idiomas do mundo.
Hierarquia de dados
•
Os campos são compostos de caracteres ou
bytes que transmitem um significado.
•
Os itens de dados processados pelos
computadores formam uma hierarquia de
dados que se torna, com relação à estrutura,
maior e mais complexa à medida que
progredimos de bits para caracteres, campos
e assim por diante.
Hierarquia de dados
•
Em geral, vários campos compõem um
registro (implementado como uma classe em
Java).
•
Um registro é um grupo de campos
relacionados.
•
Um arquivo é um grupo de registros
Hierarquia de dados
• Para facilitar a recuperação de registros específicos de um arquivo, pelo menos um campo em cada registro é escolhido como uma chave de registro.
– Uma chave de registro iden>fica um registro como
pertencente a uma pessoa ou empresa em par>cular e é única para cada registro.
– Costuma ser u>lizada para pesquisar e classificar registros.
• Há muitas maneiras de organizar registros em um arquivo. A mais comum é chamada arquivo
sequencial, em que os registros são armazenados em ordem pelo campo da chave de registro.
Hierarquia de dados
•
Um grupo de arquivos relacionados chama-‐se
banco de dados.
•
Uma coleção de programas projetados para
criar e gerenciar bancos de dados é chamada
sistema de gerenciamento de bancos de
dados
(database management system –
DBMS).
Arquivos e fluxos
•
O Java visualiza cada arquivo como um fluxo
sequencial de bytes.
•
Cada sistema operacional fornece um mecanismo
para determinar o final de um arquivo, como um
marcador de fim de arquivo ou uma
contagem
do total de bytes do arquivo
que estão gravados
na estrutura de dados administra>va man>da
pelo sistema.
•
Um programa Java simplesmente recebe uma
indicação do sistema operacional
quando ele
alcança o final do fluxo.
Arquivos e fluxos
• Fluxos de arquivos podem ser u>lizados para entrada e saída de dados, como bytes ou caracteres.
– Os fluxos de entrada e saída de bytes são conhecidos como fluxos baseados em bytes, que representam os dados no seu formato binário.
– Os fluxos de entrada e saída de caracteres são conhecidos como fluxos baseados em caracteres, que representam os dados como uma sequência de caracteres.
• Os arquivos que são criados u>lizando-‐se fluxos baseados em bytes chamam-‐se arquivos binários. • Os arquivos criados com fluxos baseados em
Arquivos e fluxos
• Um programa Java abre um arquivo criando e associando um
objeto ao fluxo de bytes ou de caracteres. Também pode associar fluxos a disposi>vos diferentes.
• O Java cria três objetos de fluxo quando um programa começa a executar:
– System.in (o objeto de fluxo de entrada padrão) normalmente insere bytes a par>r do teclado.
– System.out (o objeto de fluxo de saída padrão) normalmente permite enviar os dados de caractere para a tela.
– System.err (o objeto de fluxo de erro padrão) normalmente permite enviar as mensagens de erro baseadas em caracteres para a tela.
• A classe System fornece os métodos setIn, setOut e setErr para redirecionar os fluxos de entrada, saída e erro padrão,
Arquivos e fluxos
• Programas Java realizam o processamento de arquivos u>lizando as classes no pacote java.io.
• Inclui definições para classes de fluxos:
– FileInputStream (para entrada baseada em bytes de um
arquivo)
– FileOutputStream (para saída baseada em bytes de um arquivo)
– FileReader (para entrada baseada em caracteres de um
arquivo)
– FileWriter (para saída baseada em caracteres de um arquivo)
• Você abre um arquivo criando um objeto de uma dessas classes de fluxo. O construtor do objeto abre o arquivo.
Arquivos e fluxos
• Pode-‐se realizar a entrada e saída de objetos ou variáveis
de >pos de dados primi>vos sem ter de se preocupar com os detalhes da conversão desses valores em formato de bytes.
• Para realizar essa entrada e saída, os objetos das classes
ObjectInputStream e ObjectOutputStream podem ser u>lizados juntos com as classes de arquivos baseados em fluxos de bytes FileInputStream e FileOutputStream.
• A hierarquia completa das classes do pacote java.io pode ser examinada na documentação on-‐line em
– h:p://docs.oracle.com/javase/6/docs/api/java/io/package-‐ tree.html
Arquivos e fluxos
•
A classe
File
fornece informações sobre arquivos
e diretórios.
•
A entrada e saída baseada em caracteres pode
ser realizada com as classes
Scanner
e
Forma^er
.
•
A classe
Scanner
é extensamente u>lizada para
entrada de dados a
parKr do teclado
. Essa classe
também pode ler dados de um arquivo.
•
A classe
Forma^er
permite que os dados
formatados sejam
impressos em qualquer fluxo
baseado em texto
de uma maneira semelhante
ao método
System.out.prin_
.
Classe File
•
A classe
File
fornece quatro construtores:
– Aquele com um argumento String especifica o nome de um arquivo ou diretório para associar com o objeto File.
• O nome pode conter as informações de caminho bem como o nome de um arquivo ou diretório.
• Um caminho de arquivo ou diretório especifica sua
localização em disco.
• Um caminho absoluto contém todos os diretórios, iniciando com o diretório-‐raiz, que levam a um arquivo ou diretório específico.
• Um caminho relaKvo normalmente inicia no diretório em que o aplica>vo começou a executar e, portanto, é
Classe File
• O construtor com dois argumentos String especifica um caminho absoluto ou rela>vo e o arquivo ou diretório a associar com o
objeto File.
• O construtor com os argumentos File e String u>liza um objeto File existente que especifica o diretório-‐pai do arquivo ou diretório
especificado pelo argumento String.
• O quarto construtor u>liza um objeto URI para localizar o arquivo.
– Um Uniform Resource Iden>fier (URI) é uma forma mais geral dos Uniform Resource Locators (URLs) que são u>lizados para localizar sites na Web.
• A hierarquia completa das classes do pacote java.io pode ser visualizada na documentação on-‐line em
Exemplos de URI
• Usos de referências URI em linguagens marcadores
– Em HTML, o valor de src, atributo do elemento img, é uma referência URI, como também é o valor de href para os elementos a ou link.
– Em XML, o iden>ficador de sistema sucedendo a palavra-‐chave SYSTEM em um DTD é uma referência URI sem fragmentos.
– Em XSLT, o valor do atributo href do elemento/instrução xsl:import é uma referência URI, como também o primeiro argumento da função document().
• Exemplos de URIs Absolutas
– h:p://example.org/absolute/URI/with/absolute/path/to/resource.txt – •p://example.org/resource.txt
– file:////home/example/example.org/resource.txt – urn:issn:1535-‐3613
Exemplos de URI
• Exemplos de referências URI
– h:p://pt.wikipedia.org/wiki/URI#Exemplos_de_referências_URI ("h:p" é o nome do 'conjunto', "pt.wikipedia.org" é a 'autoridade', "/wiki/URI" é o
'caminho' apontando para este ar>go, e "#Exemplos_de_referências_URI" é um 'fragmento' apontando para esta seção)
– h:p://example.org/absolute/URI/with/absolute/path/to/resource.txt – ./rela>ve/URI/with/absolute/path/to/resource.txt – rela>ve/path/to/resource.txt – ../../../resource.txt – ../resource.txt#frag01 – resource.txt – frag01 – (cadeia vazia)
Separadores
• Um caractere separador é u>lizado para separar diretórios e arquivos no caminho.
• No Windows, o caractere separador é uma barra inver>da (\).
• No Linux/UNIX, é uma barra normal (/).
• O Java processa esses dois caracteres de maneira idênKca em um nome de caminho.
• Ao construir Strings que representam informações do caminho, u>lize File.separator para obter o separador adequado do computador local.
Acesso sequencial
• Uma SecurityExcepKon ocorre se o usuário não >ver permissão de gravar dados no arquivo.
• Uma FileNotFoundExcepKon ocorre se o arquivo não exis>r e um novo arquivo não puder ser criado.
• O método staKc System.exit termina um aplica>vo.
– Um argumento de 0 indica terminação bem-‐sucedida do programa.
– Um valor de não-‐zero normalmente indica que ocorreu um erro.
• O argumento é ú>l se o programa for executado de um arquivo em lote no Windows ou de um script de shell
Acesso sequencial
• O método Scanner hasNext determina se a
combinação de teclas de fim de arquivo foi inserida. • Uma NoSuchElementExcepKon ocorre se os dados que
estão sendo lidos por um método Scanner es>verem no formato errado ou se não houver dados para
inserir.
• Uma Forma^erClosedExcepKon ocorre se Forma:er for fechado quando você tentar gerar a saída.
• O método Forma^er close fecha o arquivo.
– Se o método close não for chamado explicitamente, o sistema operacional normalmente fechará o arquivo quando a execução do programa terminar.
Lendo dados a parKr de um arquivo
de texto de acesso sequencial
Lendo dados a parKr de um arquivo
de texto de acesso sequencial
Lendo dados a parKr de um arquivo
de texto de acesso sequencial
Se um Scanner for fechado antes dos dados serem inseridos, uma
Atualizando arquivos de acesso
sequencial
• Os dados de muitos arquivos sequenciais não podem ser
modificados sem o risco de destruir outros dados do arquivo. • Se for necessário alterar o nome “White” para “Worthington”, o
nome an>go simplesmente não poderá ser sobrescrito, porque o novo nome requer mais espaço.
• Os campos de um arquivo de texto — e por conseguinte os registros — podem variar de tamanho.
• Os registros em um arquivo de acesso sequencial normalmente não são atualizados no lugar. Em vez disso, o arquivo inteiro é
normalmente regravado.
• Reescrever todo o arquivo não é uma boa ideia para atualizar um único registro, mas razoável se um número substancial de registros >ver de ser atualizado.
Serialização de objeto
•
Para ler ou gravar um objeto inteiro em um
arquivo, o Java fornece a
serialização de objeto
.
•
Um objeto serializado é representado como uma
sequência de bytes
que inclui os dados do objeto
e as informações do seu >po.
•
Depois que um objeto serializado >ver sido
gravado em um arquivo, ele poderá ser lido a
par>r do arquivo e
desserializado
para recriar o
objeto na memória.
Serialização de objeto
•
As classes
ObjectInputStream
e
ObjectOutputStream
, que implementam,
respec>vamente, as interfaces
ObjectInput
e
ObjectOutput
, permitem que objetos inteiros
sejam lidos ou gravados em um fluxo.
•
Para u>lizar a serialização com arquivos,
inicialize os objetos
ObjectInputStream
e
ObjectOutputStream
com os objetos
Serialização de objeto
• O método de interface ObjectOutput writeObject
aceita um Object como um argumento e grava suas informações em um OutputStream.
• Uma classe que implementa ObjectOuput (como
ObjectOutputStream) declara esse método e assegura
que o objeto de saída implementa Serializable.
• O método de interface ObjectInput readObject lê e retorna uma referência a um Object a par>r de um
InputStream.
• Depois que um objeto >ver sido lido, pode-‐se fazer uma coerção da sua referência para o >po real do objeto.