Você está na página 1de 9

ARQUIVOS, FLUXOS e SERIALIZAO DE OBJETOS

Arquivos e Persistncia
Programas manipulam dados armazenados em variveis e colees na memria principal, esses dados so perdidos quando uma varivel sai do escopo ou quando o programa encerrado. Para reteno a longo prazo (persistncia) desses dados mesmo depois de os programas que os criaram encerrarem ou a mquina ser desligada, os computadores utilizam Arquivos. Esses arquivos so armazenados em dispositivos de armazenamento secundrio como HD's, Flashmemo's ou CDs. Dados mantidos em arquivos so dados persistentes porque existem alm da durao da execuo dos programas. O Java no impe nenhuma estrutura especfica a um Arquivo, portanto os arquivos devem ser estruturados para satisfazer os requisitos do aplicativo. Os Arquivos so o reflexo da Estrutura de Dados, as informaes so armazenadas em Arquivo em um formato qualquer, a forma de recuper-las na memria pode ser como arrays, listas, filas, pilhas ou rvores. Assim, a estrutura de dado em memria no precisa ser igual aos arquivos ou s tabelas dos BD relacionais.

Fluxos de Dados
O processamento de arquivos um subconjunto das capacidades de processamento de fluxos do Java, que incluem operaes de I/O da memria principal, da memria secundria (Arquivos) e conexes de rede.

Serializao de Objetos
Dados podem ser armazenados em arquivo de texto ou arquivo binrio. A tarefa de gravar e ler Objetos inteiros atravs de arquivos de texto difcil, por conta disso o Java fornece maneiras de gravar e ler Objetos em Arquivos chamada Serializao e Desserializao de Objetos. Hierarquia de dados Dados so armazenados em computadores como zeros e uns e combinaes desses valores so utilizadas para formar bytes, campos, Registros e Arquivos. Bits Um computador processa dados por combinaes de zeros e uns, o menor item de dado que assume a forma de zero ou um o BIT. Caracteres Programadores trabalham com letras, dgitos decimais e caracteres especiais conhecidos como char (formados por bits 0 e 1). Java utiliza caracteres Unicode UTF-8 de dois bytes que contm caracteres para muitos idiomas. Um subconjunto popular de Unicode o ASCII, codificao americana para letras, dgitos e caracteres especiais. Campos (Atributos) Assim como caracteres so compostos de bits, campos so compostos de caracteres char. Um campo um grupo de caracteres (bytes) que transmite um significado.

Registros (Classes) Assim como campos so compostos de caracteres, registros so compostos por campos. Um registro um grupo de campos relacionados e so implementados em Java por Classes. Arquivos Assim como registros so compostos por campos, um Arquivo composto por um grupo de Registros (classes) relacionados. Chaves de registro Para acesso a um Registro especfico num Arquivo, pelo menos um Campo em cada Registro deve ser uma "chave". Uma chave de registro nica para cada registro. Arquivo Sequencial A maneira mais comum de organizar Registros num Arquivo o Arquivo Sequencial, onde os Registros so armazenados em ordem pela Chave de Registro. Um Arquivo contm vrias classes (Registros) e cada classe contm um Campo que a Chave de Registro. Banco de Dados Assim como um Arquivo composto por Registros, um Banco de Dados composto por um grupo de Arquivos relacionados. Uma coleo de programas projetados para gerenciar Bancos de Dados chamada de SGBD ou DBMS (Data Base Management System)

Classe File
A Casse File til para recuperar informaes sobre arquivos ou diretrios em disco. No abre nem fornece mtodos de processamento de arquivos, utilizada frequentemente com objetos de outras Classes para especificar arquivos ou diretrios a manipular. Um caminho de arquivo ou diretrio (path) especifica sua localizao em disco e inclui alguns ou os principais diretrios para o arquivo ou diretrio. Um "caminho absoluto" contm todos os diretrios, desde o "raiz", que levam a um arquivo ou diretrio especfico. Um "caminho relativo" geralmente inicia a partir do diretrio (dir) no qual o arquivo comeou a executar, portanto relativo ao diretrio atual. Construtores da Classe File Com 1 argumento String - especifica nome ou diretrio de um arquivo para associar com objeto File. A String pode conter o nome do arquivo ou diretrio, bem como informaes de caminho; Com 2 argumentos String - especifica um caminho absoluto ou relativo no 1 argumento e no 2, o arquivo ou diretrio a associar com o objeto File; Com 2 argumentos (File, String) - utiliza um objeto File existente que especifica o diretrio no 1 argumento ou o diretrio especificado pelo 2 argumento string; Com 1 argumento (URI) - utiliza um objeto URI - Uniform Resourse Identifier, uma forma generalizada de URL - para localizar o arquivo. Ex Windows: file://C:/data.txt

Mtodos File comuns boolean canRed() true se um arquivo for legvel pelo aplicativo atual boolean canWrite() true se um arquivo for gravvel pelo aplicativo atual boolean exists() true se o arquivo ou dir representado pelo objeto File existir boolean isFile() true se o argumento especificado para o construtor de File um arquivo boolean isDirectory() true se o argumento especificado para o construtor de File um diretrio boolean isAbsolute() true se o argumento especificado para o construtor de File indica um patch absoluto para um arquivo ou dir String isAbsolutePath() retorna uma String com o caminho absoluto para um arquivo ou dir String getPath() retorna uma String com o caminho para um arquivo ou dir String getName() retorna uma String com o nome do arquivo ou dir String getParent() retorna uma String com o diretrio pai de um arquivo ou dir, o diretrio onde o arquivo ou dir est localizado long length() retorna o comprimento do arquivo em bytes long lastModified() dependendo da plataforma, retorna uma representao de data/hora em que o arquivo ou dir foi modificado pela ltima vez String[] list() retona um array de Strings representando o contedo de um diretrio, retorna null se o objeto File no representar um diretrio Caracteres scape Um caractere separador de caminho - barra invertida (\) - utilizado para separar diretrios(dir) e arquivos(file) no caminho(path). Utilizar (\) como um separador de diretrio em vez de "\\" numa "literal de String" um erro de lgica. "\\" representa uma sequncia scape utilizada para inserir (\) numa literal de String.

Caracteres separadores de linha especficos de cada plataforma Para gerar sada de uma nova linha no texto do arquivo, cada plataforma pode ter um caractere especfico, tais como: Windows...: (\r\n) Linux/Mac.: (\n) O especificador de formato (%n) pode ser usado em uma string de formato (printf()) para imprimir um separador de linha especfico da plataforma. O mtodo System.out.println gera sada a um separador de linha especfico da plataforma. Alm disso, independentemente do separador de linha utilizado, um programa Java ainda pode reconhecer e ler as linhas de texto.

Fluxos e Transferncia de dados


Streams so fluxos de dados que viajam atravs de um canal de comunicao entre um programa e uma fonte de dados, a transferncia de dados em Java feita atravs de streams. Fontes das quais lemos dados so fluxos de entrada (in) e aquelas nas quais gravamos dados so fluxos de sada (out). Processamento de Fluxos Em Java so definidos dois tipos de processamento de Fluxos, Fluxos baseados em bytes e Fluxos baseados em caracteres. O processamento de Fluxos orientados por bytes implementado pelas superclasses InputStream (fluxos de entrada) e OutputStream (fluxos de sada). O processamento de Fluxos orientados por caracteres implementado pelas superclasses Reader (fluxos de entrada) e Writer (fluxos de sada). Processamento de Arquivos Arquivos so processados (leitura e gravao) por meio de Fluxos. O termo fluxo, para Arquivos, refere-se a dados ordenados que so lidos ou gravados em um meio magntico. O Java v um Arquivo como um Fluxo Sequencial de bytes ou caracteres, cada Sistema Operacional fornece um mecanismo para determinar o trmino de um Arquivo, como um marcador de fim de arquivo ou uma contagem total de bytes no arquivo. O programa simplesmente recebe uma indicao do Sistema Operacional quando ele alcana o fim do fluxo.

Os Fluxos para Arquivos "baseados em bytes" representam os dados do Arquivo em formato binrio. Os Fluxos para Arquivos "baseados em caracteres" representam os dados do Arquivo como uma sequncia de caracteres (ASCII).

Com relao a dados numricos, a diferena entre as duas formas que no fluxo em bytes o valor numrico 5 pode ser utilizado em clculos enquanto no fluxo em caracteres, 5 simplesmente um valor literal que pode ser usado em uma string de texto. Arquivos criados utilizando Fluxos baseados em bytes so arquivos binrios e Arquivos criados utilizando Fluxos baseados em caracteres so arquivos de texto. Arquivos de texto podem ser processados por editores de texto, enquanto arquivos binrios so processados por programas que entendem seu contedo 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 especficas para Arquivos. O nome da subclasse composto da sua especialidade seguido do tipo de transferncia, por exemplo, a classe que faz a leitura de arquivos (files) do disco orientada por bytes (streams) chama-se FileInputStream e a orientada por caracteres, FileReader. Os programas realizam o Processamento de Arquivos em Java utilizando as classes do pacote java.io de acordo 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 Sistema Operacional para cri-lo. Fluxos de entrada (in), sada (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 execuo, o Java cria trs objetos de fluxo que so associados a diferentes dispositivos: System.in System.out System.err objeto de fluxo de entrada padro objeto de fluxo de sada padro objeto de fluxo de erro padro Leitura Gravao Erro

A classe System fornece os mtodos setIn(), setOut() e setErr() para redirecionar os fluxos de entrada, sada e erro padres. Classes Scanner e Formatter Alm das classes FileReader e FileWriter do pacote java.io, a entrada e sada para Arquivo baseadas em caractere pode ser executada com as classes Scanner e Formatter. A Classe Scanner, geralmente usada para entrada de dados a partir do teclado, tambm pode ler dados de um arquivo. A Classe Formatter permite que dados formatados sejam impressos em qualquer fluxo baseado em caractere. Um objeto Formatter gera sada para strings formatadas de forma semelhante a printf().

Serializao de objetos
A transferncia de dados de objetos feita a nvel de bytes, um desmembramento dos dados feito com a respectiva serializao e a integridade no transporte garantida. Na leitura e gravao de arquivos sequenciais de texto, gravamos os campos de um registro (Classe) em um arquivo de texto a partir de um objeto registro (classe) na memria, depois lemos esses campos a partir do Arquivo colocando seus valores novamente em um objeto registro (classe) na memria. Quando a sada dos

campos do registro gerada para o arquivo em disco, informaes como tipo de dados so perdidas (no podemos saber se o texto 3 um double, um int ou uma String), portanto temos em disco apenas dados sem informaes sobre tipos. Caso uma leitura de arquivo soubesse a que tipo de objeto os dados correspondem, ento eles seriam lidos e transferidos para o objeto desse tipo especfico. Quando sabemos todas as informaes a respeito de como os dados de um objeto so armazenados num arquivo, podemos recriar o objeto inteiro a partir de um arquivo. Para esse propsito existe o mecanismo de serializao de objetos. A serializao de objetos realizada com fluxos baseados em bytes. Logo, arquivos que criam e manipulam objetos sero arquivos binrios. Arquivos binrios no podem ser visualizados nos editores de texto padro, portanto necessrio 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 do objeto bem como o tipo de objeto e tambm as informaes sobre os tipos dos dados armazenados no objeto. Aps um objeto serializado ser gravado em um arquivo, ele pode ser lido a partir do arquivo e desserializado, ou seja, as informaes dos tipos e os bytes que representam o objeto e seus dados podem ser utilizados para recriar o objeto registro na memria uma vez que o mecanismo de serializao cria cpias exatas dos objetos sem a necessidade de sobrescrever o mtodo Object clone(). Interface Serializable Para que objetos registros (classes) possam ser serializados, necessrio que implementem a interface Serializable, uma <interface de tags > que no contm nenhum mtodo. Uma Classe que a implemente marcada com tags como um objeto Serializable assegurando que um ObjectOutputStream possa envi-lo para um fluxo de sada. Uma Classe que implemente Serializable, deve se assegurar de que cada varivel de instncia seja um tipo serializvel, do contrrio deve ser declarada transient para indicar que no serializvel e ser ignorada durante o processo de serializao. Por padro, todas as variveis de tipo primitivo so serializveis. Classes ObjectInputStream e ObjectOutputStream As classes ObjectInputStream e ObjectOutputStream so utilizadas para realizar a leitura e gravao de objetos inteiros com fluxos de bytes. A fim de utilizar a serializao para leitura e gravao de objetos em Arquivos, essas classes so inicializadas juntamente com as classes de Arquivos baseadas em fluxos de bytes FileInputStream e FileOutputStream. Esse tipo de inicializao 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 o utiliza para gravar os objetos em Arquivo. new ObjectInputStream(FileInpuStream);

ObjectInputStream .readObject(Object obj) L e retorna uma referncia a um Object a partir do Arquivo. o mtodo responsvel pela leitura de arquivos binrios. Depois que o registro lido, podemos fazer uma coero da sua referncia para o tipo real do objeto. ObjectOutputStream .writeObject(Object obj) Recebe um Object como argumento e grava todas as suas informaes em Arquivo com apenas uma instruo. ObjectOutputStream.close() Fecha tanto o ObjectOutputStream ou ObjectInputStream como o FileOutputStream ou FileInputStream empacotado. Ao utilizar fluxos empacotados, fechar o fluxo mais externo tambm fecha o fluxo subjacente.

Classes adicionais do pacote java.io para fluxos


Interfaces e Classes para entrada e sada de fluxos baseados em bytes

Interfaces e Classes para entrada e sada de fluxos baseados em caracteres

Classe JFileChooser
A classe JFileChooser exibe uma caixa de dilogo oferecendo uma Interface Grfica que permite ao usurio selecionar arquivos ou diretrios. JFileChooser.setFileSelectionMode() Especifica o que o usurio pode selecionar no fileChooser, seu parmetro recebe uma constante como argumento que inclui FILES_AND_DIRECTORIES, FILES_ONLY (default) e DIRECTORIES_ONLY.

JFileChooser.showOpenDialog() Exibe o dilogo modal - no permite ao usurio interagir com nenhuma outra janela at que o dilogo seja fechado clicando em open ou cancel, e retona um inteiro especificando em qual boto o usurio clicou para fechar o dilogo. JFileChooser.getSelectedFile() Recupera o arquivo selecionado pelo usurio no dilogo.

Você também pode gostar