ARQUIVOS, FLUXOS e SERIALIZAÇÃO DE OBJETOSArquivos e PersistênciaProgramas manipulam dados armazenados em variáveis e cole...
 Registros (Classes)Assim como campos são compostos de caracteres, registros são compostos por campos.Um registro é um gr...
Métodos File comunsboolean canRed()true se um arquivo for legível pelo aplicativo atualboolean canWrite()true se um arquiv...
Caracteres separadores de linha específicos de cada plataformaPara gerar saída de uma nova linha no texto do arquivo, cada...
Com relação a dados numéricos, a diferença entre as duas formas é que no fluxo em bytes o valor numérico5 pode ser utiliza...
campos do registro é gerada para o arquivo em disco, informações como tipo de dados são perdidas (nãopodemos saber se o te...
ObjectInputStream .readObject(Object obj)Lê e retorna uma referência a um Object a partir do Arquivo.É o método responsáve...
Interfaces e Classes para entrada e saída de fluxos baseados em caracteresClasse JFileChooserA classe JFileChooser exibe u...
JFileChooser.showOpenDialog()Exibe o diálogo modal - não permite ao usuário interagir com nenhuma outra janela até que o d...
Upcoming SlideShare
Loading in …5
×

Arquivos, Fluxos e Serialização de Objetos em Java

3,453 views
3,291 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
3,453
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
55
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Arquivos, Fluxos e Serialização de Objetos em Java

  1. 1. ARQUIVOS, FLUXOS e SERIALIZAÇÃO DE OBJETOSArquivos e PersistênciaProgramas manipulam dados armazenados em variáveis e coleções na memória principal, esses dados sãoperdidos quando uma variável sai do escopo ou quando o programa é encerrado. Para retenção a longoprazo (persistência) desses dados mesmo depois de os programas que os criaram encerrarem ou a máquinaser desligada, os computadores utilizam Arquivos. Esses arquivos são armazenados em dispositivos dearmazenamento secundário como HDs, Flashmemos ou CDs.Dados mantidos em arquivos são dados persistentes porque existem além da duração da execução dosprogramas.O Java não impõe nenhuma estrutura específica a um Arquivo, portanto os arquivos devem ser estruturadospara satisfazer os requisitos do aplicativo. Os Arquivos são o reflexo da Estrutura de Dados, as informaçõessão armazenadas em Arquivo em um formato qualquer, a forma de recuperá-las na memória pode ser comoarrays, listas, filas, pilhas ou árvores. Assim, a estrutura de dado em memória não precisa ser igual aosarquivos ou às tabelas dos BD relacionais.Fluxos de DadosO processamento de arquivos é um subconjunto das capacidades de processamento de fluxos do Java, queincluem operações de I/O da memória principal, da memória secundária (Arquivos) e conexões de rede.Serialização de ObjetosDados podem ser armazenados em arquivo de texto ou arquivo binário. A tarefa de gravar e ler Objetosinteiros através de arquivos de texto é difícil, por conta disso o Java fornece maneiras de gravar e lerObjetos em Arquivos chamada Serialização e Desserialização de Objetos.Hierarquia de dadosDados são armazenados em computadores como zeros e uns e combinações desses valores são utilizadaspara formar bytes, campos, Registros e Arquivos.  BitsUm computador processa dados por combinações de zeros e uns, o menor item de dado que assume aforma de zero ou um é o BIT.  CaracteresProgramadores trabalham com letras, dígitos decimais e caracteres especiais conhecidos como char(formados por bits 0 e 1). Java utiliza caracteres Unicode UTF-8 de dois bytes que contêm caracteres paramuitos idiomas. Um subconjunto popular de Unicode é o ASCII, codificação americana para letras, dígitos ecaracteres especiais.  Campos (Atributos)Assim como caracteres são compostos de bits, campos são compostos de caracteres char.Um campo é um grupo de caracteres (bytes) que transmite um significado.
  2. 2.  Registros (Classes)Assim como campos são compostos de caracteres, registros são compostos por campos.Um registro é um grupo de campos relacionados e são implementados em Java por Classes.  ArquivosAssim como registros são compostos por campos, um Arquivo é composto por um grupo de Registros(classes) relacionados.Chaves de registroPara acesso a um Registro específico num Arquivo, pelo menos um Campo em cada Registro deve ser uma"chave". Uma chave de registro é única para cada registro.Arquivo SequencialA maneira mais comum de organizar Registros num Arquivo é o Arquivo Sequencial, onde os Registros sãoarmazenados em ordem pela Chave de Registro. Um Arquivo contém várias classes (Registros) e cada classecontém um Campo que é a Chave de Registro.  Banco de DadosAssim como um Arquivo é composto por Registros, um Banco de Dados é composto por um grupo deArquivos relacionados. Uma coleção de programas projetados para gerenciar Bancos de Dados é chamadade SGBD ou DBMS (Data Base Management System)Classe FileA Casse File é útil para recuperar informações sobre arquivos ou diretórios em disco.Não abre nem fornece métodos de processamento de arquivos, é utilizada frequentemente com objetos deoutras Classes para especificar arquivos ou diretórios a manipular.Um caminho de arquivo ou diretório (path) especifica sua localização em disco e inclui alguns ou os principaisdiretórios para o arquivo ou diretório.Um "caminho absoluto" contém todos os diretórios, desde o "raiz", que levam a um arquivo ou diretórioespecífico.Um "caminho relativo" geralmente inicia a partir do diretório (dir) no qual o arquivo começou a executar,portanto é relativo ao diretório atual.Construtores da Classe FileCom 1 argumento String - especifica nome ou diretório de um arquivo para associar com objeto File. AString pode conter o nome do arquivo ou diretório, bem como informações de caminho;Com 2 argumentos String - especifica um caminho absoluto ou relativo no 1º argumento e no 2º, o arquivoou diretório a associar com o objeto File;Com 2 argumentos (File, String) - utiliza um objeto File existente que especifica o diretório no 1º argumentoou o diretório especificado pelo 2º argumento string;Com 1 argumento (URI) - utiliza um objeto URI - Uniform Resourse Identifier, uma forma generalizada deURL - para localizar o arquivo. Ex Windows: file://C:/data.txt
  3. 3. Métodos File comunsboolean canRed()true se um arquivo for legível pelo aplicativo atualboolean canWrite()true se um arquivo for gravável pelo aplicativo atualboolean exists()true se o arquivo ou dir representado pelo objeto File existirboolean isFile()true se o argumento especificado para o construtor de File é um arquivoboolean isDirectory()true se o argumento especificado para o construtor de File é um diretórioboolean isAbsolute()true se o argumento especificado para o construtor de File indica um patch absoluto para um arquivo ou dirString isAbsolutePath()retorna uma String com o caminho absoluto para um arquivo ou dirString getPath()retorna uma String com o caminho para um arquivo ou dirString getName()retorna uma String com o nome do arquivo ou dirString getParent()retorna uma String com o diretório pai de um arquivo ou dir, o diretório onde o arquivo ou dir estálocalizadolong length()retorna o comprimento do arquivo em byteslong lastModified()dependendo da plataforma, retorna uma representação de data/hora em que o arquivo ou dir foimodificado pela última vezString[] list()retona um array de Strings representando o conteúdo de um diretório, retorna null se o objeto File nãorepresentar um diretórioCaracteres scapeUm caractere separador de caminho - barra invertida () - é utilizado para separar diretórios(dir) earquivos(file) no caminho(path).Utilizar () como um separador de diretório em vez de "" numa "literal de String" é um erro de lógica. ""representa uma sequência scape utilizada para inserir () numa literal de String.
  4. 4. Caracteres separadores de linha específicos de cada plataformaPara gerar saída de uma nova linha no texto do arquivo, cada plataforma pode ter um caractere específico,tais como:Windows...: (rn)Linux/Mac.: (n)O especificador de formato (%n) pode ser usado em uma string de formato (printf()) para imprimir umseparador de linha específico da plataforma.O método System.out.println gera saída a um separador de linha específico da plataforma. Alémdisso, independentemente do separador de linha utilizado, um programa Java ainda pode reconhecer e leras linhas de texto.Fluxos e Transferência de dadosStreams são fluxos de dados que viajam através de um canal de comunicação entre um programa e umafonte de dados, a transferência de dados em Java é feita através de streams. Fontes das quais lemos dadossão fluxos de entrada (in) e aquelas nas quais gravamos dados são fluxos de saída (out).Processamento de FluxosEm Java são definidos dois tipos de processamento de Fluxos, Fluxos baseados em bytes e Fluxos baseadosem caracteres.O processamento de Fluxos orientados por bytes é implementado pelas superclasses InputStream(fluxos de entrada) e OutputStream (fluxos de saída). O processamento de Fluxos orientados porcaracteres é implementado pelas superclasses Reader (fluxos de entrada) e Writer (fluxos de saída).Processamento de ArquivosArquivos são processados (leitura e gravação) por meio de Fluxos. O termo fluxo, para Arquivos, refere-se adados ordenados que são lidos ou gravados em um meio magnético.O Java vê um Arquivo como um Fluxo Sequencial de bytes ou caracteres, cada Sistema Operacional forneceum mecanismo para determinar o término de um Arquivo, como um marcador de fim de arquivo ou umacontagem total de bytes no arquivo. O programa simplesmente recebe uma indicação do SistemaOperacional quando ele alcança o fim do fluxo.Os Fluxos para Arquivos "baseados em bytes" representam os dados do Arquivo em formato binário.Os Fluxos para Arquivos "baseados em caracteres" representam os dados do Arquivo como uma sequênciade caracteres (ASCII).
  5. 5. Com relação a dados numéricos, a diferença entre as duas formas é que no fluxo em bytes o valor numérico5 pode ser utilizado em cálculos enquanto no fluxo em caracteres, 5 é simplesmente um valor literal quepode ser usado em uma string de texto. Arquivos criados utilizando Fluxos baseados em bytes são arquivosbinários e Arquivos criados utilizando Fluxos baseados em caracteres são arquivos de texto. Arquivos detexto podem ser processados por editores de texto, enquanto arquivos binários são processados porprogramas que entendem seu conteúdo e ordenamento.Como o processamento de Arquivos é um subconjunto das capacidades de processamento de Fluxos,existem subclasses para cada uma destas hierarquias que tratam de tarefas de leitura e escrita específicaspara Arquivos. O nome da subclasse é composto da sua especialidade seguido do tipo de transferência, porexemplo, a classe que faz a leitura de arquivos (files) do disco orientada por bytes (streams) chama-seFileInputStream e a orientada por caracteres, FileReader.Os programas realizam o Processamento de Arquivos em Java utilizando as classes do pacote java.io deacordo com a seguinte hierarquia:Arquivos com fluxos orientados por bytes, FileInputStream e FileOutputStream.Arquivos com fluxos orientados por caracteres, FileReader e FileWriter.Abre-se um arquivo criando um objeto dessas Classes e o construtor do objeto interage com o SistemaOperacional para criá-lo.Fluxos de entrada (in), saída (out) e erro (err)Um programa Java abre (cria) um Arquivo criando e associando um Objeto ao fluxo de bytes ou caracteres.Quando um programa inicia a execução, o Java cria três objetos de fluxo que são associados a diferentesdispositivos:System.in objeto de fluxo de entrada padrão LeituraSystem.out objeto de fluxo de saída padrão GravaçãoSystem.err objeto de fluxo de erro padrão ErroA classe System fornece os métodos setIn(), setOut() e setErr() para redirecionar os fluxos deentrada, saída e erro padrões.Classes Scanner e FormatterAlém das classes FileReader e FileWriter do pacote java.io, a entrada e saída para Arquivobaseadas em caractere pode ser executada com as classes Scanner e Formatter. A Classe Scanner,geralmente usada para entrada de dados a partir do teclado, também pode ler dados de um arquivo. AClasse Formatter permite que dados formatados sejam impressos em qualquer fluxo baseado emcaractere. Um objeto Formatter gera saída para strings formatadas de forma semelhante a printf().Serialização de objetosA transferência de dados de objetos é feita a nível de bytes, um desmembramento dos dados é feito com arespectiva serialização e a integridade no transporte é garantida.Na leitura e gravação de arquivos sequenciais de texto, gravamos os campos de um registro (Classe) em umarquivo de texto a partir de um objeto registro (classe) na memória, depois lemos esses campos a partir doArquivo colocando seus valores novamente em um objeto registro (classe) na memória. Quando a saída dos
  6. 6. campos do registro é gerada para o arquivo em disco, informações como tipo de dados são perdidas (nãopodemos saber se o texto 3 é um double, um int ou uma String), portanto temos em disco apenas dados seminformações sobre tipos.Caso uma leitura de arquivo soubesse a que tipo de objeto os dados correspondem, então eles seriam lidose transferidos para o objeto desse tipo específico. Quando sabemos todas as informações a respeito decomo os dados de um objeto são armazenados num arquivo, podemos recriar o objeto inteiro a partir de umarquivo. Para esse propósito existe o mecanismo de serialização de objetos.A serialização de objetos é realizada com fluxos baseados em bytes. Logo, arquivos que criam e manipulamobjetos serão arquivos binários. Arquivos binários não podem ser visualizados nos editores de texto padrão,portanto é necessário escrever um aplicativo que seja capaz de ler e exibir objetos serializados.Um objeto serializado é um objeto representado como uma sequencia de bytes que inclui os dados doobjeto bem como o tipo de objeto e também as informações sobre os tipos dos dados armazenados noobjeto. Após um objeto serializado ser gravado em um arquivo, ele pode ser lido a partir do arquivo edesserializado, ou seja, as informações dos tipos e os bytes que representam o objeto e seus dados podemser utilizados para recriar o objeto registro na memória uma vez que o mecanismo de serialização criacópias exatas dos objetos sem a necessidade de sobrescrever o método Object clone().Interface SerializablePara que objetos registros (classes) possam ser serializados, é necessário que implementem a interfaceSerializable, uma <interface de tags > que não contém nenhum método. Uma Classe que aimplemente é marcada com tags como um objeto Serializable assegurando que umObjectOutputStream possa enviá-lo para um fluxo de saída.Uma Classe que implemente Serializable, deve se assegurar de que cada variável de instância seja umtipo serializável, do contrário deve ser declarada transient para indicar que não é serializável e serignorada durante o processo de serialização. Por padrão, todas as variáveis de tipo primitivo sãoserializáveis.Classes ObjectInputStream e ObjectOutputStreamAs classes ObjectInputStream e ObjectOutputStream são utilizadas para realizar a leitura egravação de objetos inteiros com fluxos de bytes.A fim de utilizar a serialização para leitura e gravação de objetos em Arquivos, essas classes sãoinicializadas juntamente com as classes de Arquivos baseadas em fluxos de bytes FileInputStream eFileOutputStream.Esse tipo de inicialização de objetos de fluxos com outros objetos de fluxos é chamada de empacotamento.O novo objeto de fluxo a ser criado empacota o objeto de fluxo passado como argumento do construtor e outiliza para gravar os objetos em Arquivo.new ObjectInputStream(FileInpuStream);
  7. 7. ObjectInputStream .readObject(Object obj)Lê e retorna uma referência a um Object a partir do Arquivo.É o método responsável pela leitura de arquivos binários.Depois que o registro é lido, podemos fazer uma coerção da sua referência para o tipo real do objeto.ObjectOutputStream .writeObject(Object obj)Recebe um Object como argumento e grava todas as suas informações em Arquivo com apenas umainstrução.ObjectOutputStream.close()Fecha tanto o ObjectOutputStream ou ObjectInputStream como o FileOutputStream ouFileInputStream empacotado.Ao utilizar fluxos empacotados, fechar o fluxo mais externo também fecha o fluxo subjacente.Classes adicionais do pacote java.io para fluxosInterfaces e Classes para entrada e saída de fluxos baseados em bytes
  8. 8. Interfaces e Classes para entrada e saída de fluxos baseados em caracteresClasse JFileChooserA classe JFileChooser exibe uma caixa de diálogo oferecendo uma Interface Gráfica que permite aousuário selecionar arquivos ou diretórios.JFileChooser.setFileSelectionMode()Especifica o que o usuário pode selecionar no fileChooser, seu parâmetro recebe uma constante comoargumento que inclui FILES_AND_DIRECTORIES, FILES_ONLY (default) e DIRECTORIES_ONLY.
  9. 9. JFileChooser.showOpenDialog()Exibe o diálogo modal - não permite ao usuário interagir com nenhuma outra janela até que o diálogo sejafechado clicando em open ou cancel, e retona um inteiro especificando em qual botão o usuário clicou parafechar o diálogo.JFileChooser.getSelectedFile()Recupera o arquivo selecionado pelo usuário no diálogo.

×