02 arquivos

55
Arquivos Estruturas de Dados II – Vanessa Braganholo

Upload: marcelolecram

Post on 19-Jul-2015

90 views

Category:

Software


2 download

TRANSCRIPT

Page 1: 02 arquivos

Arquivos

Estruturas de Dados II – Vanessa Braganholo

Page 2: 02 arquivos

Entidades }  Aplicações precisam armazenar dados sobre as mais

diversas entidades, que podem ser concretas ou abstratas }  Funcionário de uma empresa (concreto) }  Carros de uma locadora de veículos (concreto) }  Contas-corrente dos clientes de um banco (abstrato) }  Ligações telefônicas dos clientes de uma empresa de telefonia

(abstrato)

Page 3: 02 arquivos

Atributos }  Cada uma dessas entidades pode ser descrita por um

conjunto de atributos }  Funcionário: nome, CPF, data-nascimento, salário }  Carro: marca, modelo, ano-fabricação, placa }  Conta-Corrente: agência, conta, saldo }  Ligações Telefônicas: data, origem, destino, duração

}  Os atributos também podem ser chamados de campos

Page 4: 02 arquivos

Registros }  Indivíduos dessas entidades possuem um valor para cada

um desses atributos (chamados de pares atributo-valor)

}  Um conjunto de pares atributo-valor que identifica um indivíduo de uma entidade é chamado de registro

Page 5: 02 arquivos

Exemplos de Registros }  Funcionário: <nome, João>, <CPF, 012345678-90>, <data-nascimento,

10/04/1980>, <salário, 3000> }  Carro <marca, Honda>, <modelo, Fit>, <ano-fabricação, 2010>,

<placa, XYZ0123> }  Conta-Corrente <agencia, 0123>, <conta, 123456>, <saldo, 2000> }  Ligação Telefônica <data, 01/07/2010>, <origem, 21-2598-3311>, <destino,

21-2589-3322>, <duração, 10’36”>

Page 6: 02 arquivos

Tabela }  Uma tabela é um conjunto ordenado de registros. Uma

tabela pode ser armazenada em memória principal ou em memória secundária (disco)

}  Nesse segundo caso, também costuma ser chamada de arquivo

Page 7: 02 arquivos

Exemplo: Arquivo de Funcionários

Nome   CPF   Data-­‐Nascimento   Salário  

João   012345678-­‐90   10/04/1980   3000  

Maria   234567890-­‐12   25/07/1978   5000  

Lúcia   345678901-­‐23   27/04/1981   1500  

IMPORTANTE: Todos os registros de uma mesma tabela possuem a mesma estrutura (mesmo conjunto de atributos/campos)

Page 8: 02 arquivos

Problema: encontrar registros }  Problema comum de diversas aplicações: encontrar um ou

mais registros em uma tabela }  Encontrar o empregado Maria }  Encontrar todos os empregados que ganham 3000 }  Encontrar todos os empregados que nasceram em 27/04/1981

Page 9: 02 arquivos

Conceito de Chave }  Dados usados para encontrar um registro: chave }  Chave: subconjunto de atributos que identifica um

determinado registro

Page 10: 02 arquivos

Chave Primária e Secundária }  Chave primária: subconjunto de atributos que identifica

unicamente um determinado registro Exemplo: CPF do funcionário ou RG do funcionário }  Na hipótese de uma chave primária ser formada por uma

combinação de campos, essa combinação deve ser mínima (não deve conter campos supérfulos)

}  Eventualmente, podemos encontrar mais de uma combinação mínima de campos que forma uma chave primária

}  Chave secundária: subconjunto de atributos que identificam um conjunto de registros de uma tabela Exemplo: Nome do funcionário

Page 11: 02 arquivos

Tabelas }  Aplicações reais lidam com várias tabelas, cada uma delas

representando uma entidade

}  Uma aplicação de controle bancário precisaria de quais tabelas?

Page 12: 02 arquivos

Aplicação Bancária }  Uma aplicação de controle bancário precisaria de

quais tabelas? }  Cliente }  Agência }  Conta-Corrente

Page 13: 02 arquivos

Certa redundância é necessária }  Neste caso, é necessário correlacionar os dados, para que

seja possível saber que conta pertence a que agência, e que conta pertence a que cliente

}  Para isso, é usual repetir algum dado (um código,por exemplo) no outro arquivo

}  Cliente: CodCliente, Nome, CPF, Endereço }  Agência: CodAgencia, NumeroAgencia, Endereco }  Conta-Corrente: CodAgencia, CodCliente, CodConta,

NumeroConta, Saldo

Page 14: 02 arquivos

Certa redundância é necessária }  Neste caso, é necessário correlacionar os dados, para que

seja possível saber que conta pertence a que agência, e que conta pertence a que cliente

}  Para isso, é usual repetir algum dado (um código,por exemplo) no outro arquivo

}  Cliente: CodCliente, Nome, CPF, Endereço }  Agência: CodAgencia, NumeroAgencia, Endereco }  Conta-Corrente: CodAgencia, CodCliente, CodConta, Numero

Conta, Saldo

Quais são as chaves primárias e secundárias deste exemplo?

Page 15: 02 arquivos

Aplicação Financeira }  Chaves primárias:

}  Cliente: CodCliente }  Agência: CodAgencia }  Conta-Corrente: CodAgencia E CodConta

}  Chaves primárias alternativas: }  Cliente: CPF }  Agência: NumeroAgencia }  Conta-Corrente: NumeroConta

}  Chaves secundárias: }  Cliente: Nome }  Agência: Endereço }  Conta-Corrente: CodAgencia, CodCliente, Saldo

Page 16: 02 arquivos

Discussão sobre chaves }  Por quê não usar CPF como chave primária de cliente?

Por quê os atributos artificiais (código)?

Page 17: 02 arquivos

Exercício Deseja-se automatizar uma locadora de automóveis. A locadora possui filiais espalhadas por todo país. Cada filial possui um código que a identifica, um telefone e um endereço. Cada filial da locadora sedia um conjunto de veículos que ela aluga. O veículo é identificado por um número sequencial que o distingue dos demais veículos da filial. Para o veículo é importante saber a placa, data de vencimento do seguro, nome do modelo, número de portas e se possui ar-condicionado ou não. Quando um veículo é alugado é fechado um contrato de aluguel. Cada contrato possui um número identificador, uma data de saída do veículo, uma data de retorno provável, para veículos ainda não retornados, e uma data de retorno efetivo, para veículos já retornados. O contrato é feito para um veículo e um cliente. Para os clientes é preciso armazenar seu nome, CPF, endereço, o telefone, bem como o número e data de expiração de seu cartão de crédito.

Page 18: 02 arquivos

Exercício }  Para o cenário das locadoras, identificar:

}  Entidades }  Atributos }  Chaves primárias

Page 19: 02 arquivos

Discussão }  Por que não usar uma única tabela?

Page 20: 02 arquivos

Banco de Dados }  Esse conjunto de arquivos pode ser considerado um

banco de Dados?

Page 21: 02 arquivos

Características de um Sistema de Gerência de Banco de Dados

}  Natureza auto-descritiva do sistema de banco de dados: banco de dados possui um catálogo onde estão descritas as estruturas e tipos de dados de cada tabela e suas restrições – ex. quais são as chaves primárias de cada tabela

}  Isolamento entre os programas e os dados, e a abstração dos dados: em programação com arquivos a estrutura dos arquivos é embutida dentro das aplicações. Isso não acontece quando se usa banco de dados.

}  Suporte para as múltiplas visões dos dados: usuários diferentes podem ver porções diferentes dos dados

}  Compartilhamento de dados e processamento de transações multi-usuários

Page 22: 02 arquivos

Características de um Sistema de Gerência de Banco de Dados

}  Natureza auto-descritiva do sistema de banco de dados: banco de dados possui um catálogo onde estão descritas as estruturas e tipos de dados de cada tabela e suas restrições – ex. quais são as chaves primárias de cada tabela

}  Isolamento entre os programas e os dados, e a abstração dos dados: em programação com arquivos a estrutura dos arquivos é embutida dentro das aplicações. Isso não acontece quando se usa banco de dados.

}  Suporte para as múltiplas visões dos dados: usuários diferentes podem ver porções diferentes dos dados

}  Compartilhamento de dados e processamento de transações multi-usuários NÃO É O NOSSO FOCO

NESSA DISCIPLINA!

Page 23: 02 arquivos

Níveis de Organização das tabelas/arquivos

}  Organização Lógica dos dados: é a visão que o usuário tem dos dados, com base em entidades, seus atributos e seus relacionamentos

}  Organização Física dos dados: é a maneira pela qual as informações ficam armazenadas nos dispositivos periféricos (disco, pen-drive, etc.)

Page 24: 02 arquivos

Dependência entre programas e dados }  Os programas de computador são mais ou menos

dependentes da organização física dos dados }  Eles podem ser classificados em quatro categorias

Page 25: 02 arquivos

Categoria 1: Programas Dependentes dos Dados

}  Programas têm acesso aos dados especificando endereços absolutos de células de armazenamento

}  Se os dados mudarem de lugar, os programas que os acessam precisam ser modificados

}  Ocorre nas chamadas de baixo nível dos sistemas operacionais

}  Exemplo: informação sobre espaço livre em um arquivo em um sistema operacional pode ser guardada em um bloco particular do disco

Page 26: 02 arquivos

Categoria 2: Independência Física dos Dados

}  Programas acessam a memória pelo nome e não por endereço (memória primária), ou pela posição relativa ao início do arquivo (memória secundária)

}  O mapeamento (nome → endereço) é feito pelo sistema operacional

}  Exemplo: programas escritos em linguagens de Terceira Geração que só precisam conhecer a organização lógica dos dados (C, Java, Pascal...)

}  Programas dependem da estrutura lógica dos arquivos

Page 27: 02 arquivos

Categoria 3: Independência Lógica Parcial dos Dados

}  Programas desta categoria podem operar sobre diversos arquivos (com estruturas diferentes) sem serem modificados.

}  Estes programas buscam a estrutura dos dados nas informações disponíveis no meio do armazenamento e fazem uma adaptação em tempo de execução do programa.

}  Caso a adaptação ocorresse em tempo de compilação, seria o caso de programas de categoria 2

}  Exemplo de operação: ler o próximo registro de um arquivo

Page 28: 02 arquivos

Categoria 4: Independência Lógica dos Dados

}  Programas dessa categoria armazenam a descrição dos dados junto com eles

}  Por isso, os programas não necessitam definir a estrutura dos dados

}  Exemplo: programas que utilizam SGBDs

Page 29: 02 arquivos

Operações sobre arquivos }  Programas que lidam com arquivos realizam os seguintes

tipos de operações sobre eles: }  Criação: alocação e inicialização da área de dados, assim como

de seus descritores }  Destruição: liberação da área de dados e descritores usados na

representação da tabela }  Inserção: inclusão de novo registro na tabela }  Exclusão: remoção de um registro da tabela }  Alteração: modificação dos valores de um ou mais atributos/

campos da tabela }  Consulta: obtenção dos valores de todos os campos de um

registro, dada uma chave de entrada

Page 30: 02 arquivos

Refrescando a memória…

Page 31: 02 arquivos

Tutorial sobre Manipulação de Arquivos em Java

Fonte: http://download.oracle.com/javase/tutorial/essential/io

Page 32: 02 arquivos

IDE Java: NetBeans

Page 33: 02 arquivos

I/O Stream }  Um I/O Stream em Java representa uma fonte de entrada ou

saída destino }  Um stream pode representar diferentes tipos de fonte ou

destino: }  Arquivos em disco }  Dispositivos }  Outros programas }  Estruturas em memória }  …

}  Suportam diferentes tipos de dados: }  Bytes }  Tipos primitivos de dados (inteiros, strings, …) }  Caracteres }  Objetos

Page 34: 02 arquivos

I/O Stream }  Independente de como funcionam internamente, todos os

streams seguem um modelo simples de interação com programas

}  Um stream é uma sequencia de dados }  Para leitura: input stream }  Para gravação: output stream

Page 35: 02 arquivos

I/O Input Stream }  Um programa utiliza um Input Stream para ler dados

de uma fonte, um item de cada vez

Page 36: 02 arquivos

I/O Output Stream }  Um programa utiliza um Output Stream para gravar

dados em um destino, um item de cada vez

Page 37: 02 arquivos

Na nossa disciplina }  Fonte e destino são arquivos }  Exemplo de arquivo a ser manipulado

xanadu.txt

In Xanadu did Kubla Khan A stately pleasure-dome decree: Where Alph, the sacred river, ran Through caverns measureless to man Down to a sunless sea.

Page 38: 02 arquivos

Byte Streams }  Permitem realizar entrada e saída de bytes de 8bits

Page 39: 02 arquivos

ByteStream: Como funciona…

Page 40: 02 arquivos

Exemplo }  Ver arquivo CopyBytes.java

}  NOTA: Método read() retorna um int ao invés de um byte }  Isso acontece para que seja possível o método retornar -1 quando o stream terminar

Page 41: 02 arquivos

Considerações sobre o exemplo }  Sempre feche os streams utilizados

}  Ao fechá-los, vc libera a memória consumida por eles

}  Pode ocorrer erro ao abrir o InputStream ou o OutputStream (ou ambos) }  Por isso é importante testar se são diferentes de null antes de

fechá-los

Page 42: 02 arquivos

ByteStream }  Muito baixo nível }  Existem outros tipos de stream para tratar outros tipos

de dados

}  Mas são importantes porque todos os outros são construídos sobre ele

}  Nosso arquivo exemplo é um arquivo de texto, então vamos modificar o programa um pouco para tratar isso

Page 43: 02 arquivos

Character Stream }  Mesmo princípio de funcionamento do ByteStream }  Faz conversão automática da representação dos

caracteres em Java (que usa Unicode) para o enconding de caracteres local

}  Ver aquivo CopyCharacter.java

}  Principais diferenças entre este exemplo e o anterior: }  Uso de FileReader ao invés de FileInputStream }  Uso de FileWriter ao invés de FileOutputStream

Page 44: 02 arquivos

Entrada e Saída }  Neste exemplo, o disco é acessado para ler cada

caractere do arquivo, e depois novamente para gravar cada caractere }  MUITO LENTO!!

}  Solução: utilizar BufferedStreams }  O sistema operacional faz I/O apenas quando o Buffer está

vazio

Page 45: 02 arquivos

I/O Orientada a linhas }  Para arquivos texto, é possível ler linhas inteiras de uma

só vez, usando um buffer: BufferedReader (para leitura) e PrintWriter (para gravação)

}  Linha: }  delimitada por um CR ou LF ("\r\n") }  delimitada por CR ("\r") }  delimitada por LF ("\n")

}  Ver arquivo CopyLines.java

Page 46: 02 arquivos

Foco da disciplina }  Arquivos binários ao invés de arquivos texto

}  Como implementar um programa que grava registros de funcionários, e depois lê esses registros?

}  Usar DataStreams }  Possuem métodos específicos para ler/gravar tipos específicos

(inteiro, string, etc)

Page 47: 02 arquivos

DataStreams }  Exemplo do funcionário

}  Primeiro problema: em Java não existe o conceito de registro

}  Solução de contorno: }  Criar uma classe Funcionário com os atributos do funcionário

Page 48: 02 arquivos

Classe Funcionário public class Funcionario { public int codFuncionario; public String nome; public String cpf; public String dataNascimento;

public float salario; }

NOTA IMPORTANTE: não é uma boa prática de programação utilizar atributos públicos nas classes. Na disciplina, vamos adotar esta opção apenas para simplificar os exemplos. O correto seria implementar métodos get e set para cada atributo.

Page 49: 02 arquivos

Manipulação }  DataStream detecta final de arquivo lançando uma

exceção java.io.EOFException }  Lógica para testar final de arquivo agora não é mais baseada no

teste de valor -1 }  Capturar a exceção e fechar o DataStream

}  Ver arquivo ManipulaFuncionario.java

Page 50: 02 arquivos

Exercício }  Alterar a classe ManipulaFuncionario para ler os dados do

funcionário a ser gravado do teclado (atenção: criar uma nova classe! Não sobre-escrever a classe!)

}  A cada funcionário informado, perguntar se deseja ler os dados de mais um funcionário }  Se sim, ler mais um funcionário }  Se não, gravar todos os funcionários lidos

Page 51: 02 arquivos

Orientação a objetos }  Exemplo anterior fere os princípios de orientação a

objetos }  Ideal é dar a responsabilidade de ler registro e gravar registro à

classe Funcionário

}  Ver arquivo FuncionarioOO.java }  Ver arquivo ManipulaFuncionarioOO.java

Page 52: 02 arquivos

Flush }  Os métodos que utilizam buffer para gravação só fazem a

gravação em disco quando o buffer está cheio }  Às vezes é necessário ter mais controle sobre quando os

dados realmente serão gravados }  AutoFlush: Algumas classes buffered output (ex. PrintWriter)

possuem um atributo autoFlush. Quando este atributo está ligado (true), o buffer é gravado em disco a cada vez que uma operação println é executada

}  Alternativa: Método flush força gravação do buffer em disco

Page 53: 02 arquivos

Fonte }  http://download.oracle.com/javase/tutorial/essential/io

Page 54: 02 arquivos

Pratique! }  Execute os códigos dos exemplos deste tutorial em casa

Page 55: 02 arquivos

Exercício }  Modifique as classes para lidar com registros de conta-

corrente }  Dois arquivos:

}  Agência (Cod, Nome, Gerente) }  Conta-Corrente (Cod, CodAgencia, Saldo)

}  Usuário deve poder escolher o que quer cadastrar }  Dados devem ser lidos do teclado }  Aplicação deve ter opção de Cadastrar, Ler ou Sair