Você está na página 1de 55

Arquivos

Estruturas de Dados II Vanessa Braganholo

Entidades
}

Aplicaes precisam armazenar dados sobre as mais


diversas entidades, que podem ser concretas ou
abstratas
}
}
}
}

Funcionrio de uma empresa (concreto)


Carros de uma locadora de veculos (concreto)
Contas-corrente dos clientes de um banco (abstrato)
Ligaes telefnicas dos clientes de uma empresa de telefonia
(abstrato)

Atributos
}

Cada uma dessas entidades pode ser descrita por um


conjunto de atributos
}
}
}
}

Funcionrio: nome, CPF, data-nascimento, salrio


Carro: marca, modelo, ano-fabricao, placa
Conta-Corrente: agncia, conta, saldo
Ligaes Telefnicas: data, origem, destino, durao

Os atributos tambm podem ser chamados de campos

Registros
Indivduos dessas entidades possuem um valor para cada
um desses atributos (chamados de pares atributovalor)
} Um conjunto de pares atributo-valor que identifica um
indivduo de uma entidade chamado de registro
}

Exemplos de Registros
Funcionrio:
<nome, Joo>, <CPF, 012345678-90>, <data-nascimento,
10/04/1980>, <salrio, 3000>
} Carro
<marca, Honda>, <modelo, Fit>, <ano-fabricao, 2010>,
<placa, XYZ0123>
} Conta-Corrente
<agencia, 0123>, <conta, 123456>, <saldo, 2000>
} Ligao Telefnica
<data, 01/07/2010>, <origem, 21-2598-3311>, <destino,
21-2589-3322>, <durao, 1036>
}

Tabela
Uma tabela um conjunto ordenado de registros. Uma
tabela pode ser armazenada em memria principal ou em
memria secundria (disco)
} Nesse segundo caso, tambm costuma ser chamada de
arquivo
}

Exemplo: Arquivo de Funcionrios

Nome

CPF

Data-Nascimento

Salrio

Joo

012345678-90 10/04/1980

3000

Maria

234567890-12 25/07/1978

5000

Lcia

345678901-23 27/04/1981

1500

IMPORTANTE: Todos os registros de uma mesma tabela possuem a


mesma estrutura (mesmo conjunto de atributos/campos)

Problema: encontrar registros


}

Problema comum de diversas aplicaes: 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

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

Chave Primria e Secundria


}

Chave primria: subconjunto de atributos que identifica


unicamente um determinado registro Exemplo: CPF do
funcionrio ou RG do funcionrio
}

Na hiptese de uma chave primria ser formada por uma


combinao de campos, essa combinao deve ser mnima (no
deve conter campos suprfulos)
Eventualmente, podemos encontrar mais de uma combinao
mnima de campos que forma uma chave primria

Chave secundria: subconjunto de atributos que


identificam um conjunto de registros de uma tabela
Exemplo: Nome do funcionrio

Tabelas
}

Aplicaes reais lidam com vrias tabelas, cada uma delas


representando uma entidade

Uma aplicao de controle bancrio precisaria de


quais tabelas?

Aplicao Bancria
}

Uma aplicao de controle bancrio precisaria de


quais tabelas?
}
}
}

Cliente
Agncia
Conta-Corrente

Certa redundncia necessria


Neste caso, necessrio correlacionar os dados, para que
seja possvel saber que conta pertence a que agncia, e
que conta pertence a que cliente
} Para isso, usual repetir algum dado (um cdigo,por
exemplo) no outro arquivo
}

}
}
}

Cliente: CodCliente, Nome, CPF, Endereo


Agncia: CodAgencia, NumeroAgencia, Endereco
Conta-Corrente: CodAgencia, CodCliente, CodConta,
NumeroConta, Saldo

Certa redundncia necessria


Neste caso, necessrio correlacionar os dados, para que
seja possvel saber que conta pertence a que agncia, e
que conta pertence a que cliente
} Para isso, usual repetir algum dado (um cdigo,por
exemplo) no outro arquivo
}

}
}
}

Cliente: CodCliente, Nome, CPF, Endereo


Agncia: CodAgencia, NumeroAgencia, Endereco
Conta-Corrente: CodAgencia, CodCliente, CodConta, Numero
Conta, Saldo

Quais so as chaves primrias e secundrias deste


exemplo?

Aplicao Financeira
}

Chaves primrias:
}
}
}

Chaves primrias alternativas:


}
}
}

Cliente: CodCliente
Agncia: CodAgencia
Conta-Corrente: CodAgencia E CodConta
Cliente: CPF
Agncia: NumeroAgencia
Conta-Corrente: NumeroConta

Chaves secundrias:
}
}
}

Cliente: Nome
Agncia: Endereo
Conta-Corrente: CodAgencia, CodCliente, Saldo

Discusso sobre chaves


}

Por qu no usar CPF como chave primria de cliente?


Por qu os atributos artificiais (cdigo)?

Exerccio
Deseja-se automatizar uma locadora de automveis. A locadora
possui filiais espalhadas por todo pas. Cada filial possui um cdigo
que a identifica, um telefone e um endereo. Cada filial da
locadora sedia um conjunto de veculos que ela aluga. O veculo
identificado por um nmero sequencial que o distingue dos
demais veculos da filial. Para o veculo importante saber a placa,
data de vencimento do seguro, nome do modelo, nmero de
portas e se possui ar-condicionado ou no. Quando um veculo
alugado fechado um contrato de aluguel. Cada contrato possui
um nmero identificador, uma data de sada do veculo, uma data
de retorno provvel, para veculos ainda no retornados, e uma
data de retorno efetivo, para veculos j retornados. O contrato
feito para um veculo e um cliente. Para os clientes preciso
armazenar seu nome, CPF, endereo, o telefone, bem como o
nmero e data de expirao de seu carto de crdito.

Exerccio
}

Para o cenrio das locadoras, identificar:


}
}
}

Entidades
Atributos
Chaves primrias

Discusso
}

Por que no usar uma nica tabela?

Banco de Dados
}

Esse conjunto de arquivos pode ser considerado um


banco de Dados?

Caractersticas de um Sistema de Gerncia


de Banco de Dados
}

}
}

Natureza auto-descritiva do sistema de banco de dados:


banco de dados possui um catlogo onde esto descritas as
estruturas e tipos de dados de cada tabela e suas restries
ex. quais so as chaves primrias de cada tabela
Isolamento entre os programas e os dados, e a
abstrao dos dados: em programao com arquivos a
estrutura dos arquivos embutida dentro das aplicaes. Isso
no acontece quando se usa banco de dados.
Suporte para as mltiplas vises dos dados: usurios
diferentes podem ver pores diferentes dos dados
Compartilhamento de dados e processamento de
transaes multi-usurios

Caractersticas de um Sistema de Gerncia


de Banco de Dados
}

}
}

Natureza auto-descritiva do sistema de banco de dados:


banco de dados possui um catlogo onde esto descritas as
estruturas e tipos de dados de cada tabela e suas restries
ex. quais so as chaves primrias de cada tabela
Isolamento entre os programas e os dados, e a
abstrao dos dados: em programao com arquivos a
estrutura dos arquivos embutida dentro das aplicaes. Isso
no acontece quando se usa banco de dados.
Suporte para as mltiplas vises dos dados: usurios
diferentes podem ver pores diferentes dos dados
Compartilhamento de dados e processamento de
transaes multi-usurios
NO O NOSSO FOCO

NESSA DISCIPLINA!

Nveis de Organizao das tabelas/arquivos


Organizao Lgica dos dados: a viso que o usurio
tem dos dados, com base em entidades, seus atributos e
seus relacionamentos
} Organizao Fsica dos dados: a maneira pela qual as
informaes ficam armazenadas nos dispositivos
perifricos (disco, pen-drive, etc.)
}

Dependncia entre programas e dados


Os programas de computador so mais ou menos
dependentes da organizao fsica dos dados
} Eles podem ser classificados em quatro categorias
}

Categoria 1:
Programas Dependentes dos Dados
Programas tm acesso aos dados especificando endereos
absolutos de clulas de armazenamento
} Se os dados mudarem de lugar, os programas que os
acessam precisam ser modificados
} Ocorre nas chamadas de baixo nvel dos sistemas
operacionais
} Exemplo: informao sobre espao livre em um arquivo
em um sistema operacional pode ser guardada em um
bloco particular do disco
}

Categoria 2:
Independncia Fsica dos Dados
Programas acessam a memria pelo nome e no por
endereo (memria primria), ou pela posio relativa ao
incio do arquivo (memria secundria)
} O mapeamento (nome endereo) feito pelo sistema
operacional
} Exemplo: programas escritos em linguagens de Terceira
Gerao que s precisam conhecer a organizao lgica
dos dados (C, Java, Pascal...)
} Programas dependem da estrutura lgica dos arquivos
}

Categoria 3:
Independncia Lgica 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
informaes disponveis no meio do armazenamento e
fazem uma adaptao em tempo de execuo do
programa.
} Caso a adaptao ocorresse em tempo de compilao,
seria o caso de programas de categoria 2
} Exemplo de operao: ler o prximo registro de um
arquivo
}

Categoria 4:
Independncia Lgica dos Dados
Programas dessa categoria armazenam a descrio dos
dados junto com eles
} Por isso, os programas no necessitam definir a estrutura
dos dados
} Exemplo: programas que utilizam SGBDs
}

Operaes sobre arquivos


}

Programas que lidam com arquivos realizam os seguintes


tipos de operaes sobre eles:
}
}
}
}
}
}

Criao: alocao e inicializao da rea de dados, assim como


de seus descritores
Destruio: liberao da rea de dados e descritores usados na
representao da tabela
Insero: incluso de novo registro na tabela
Excluso: remoo de um registro da tabela
Alterao: modificao dos valores de um ou mais atributos/
campos da tabela
Consulta: obteno dos valores de todos os campos de um
registro, dada uma chave de entrada

Refrescando a memria

Tutorial sobre Manipulao de


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

IDE Java: NetBeans

I/O Stream
}
}

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


sada destino
Um stream pode representar diferentes tipos de fonte ou
destino:
}
}
}
}
}

Arquivos em disco
Dispositivos
Outros programas
Estruturas em memria

Suportam diferentes tipos de dados:


}
}
}
}

Bytes
Tipos primitivos de dados (inteiros, strings, )
Caracteres
Objetos

I/O Stream
Independente de como funcionam internamente, todos os
streams seguem um modelo simples de interao com
programas
} Um stream uma sequencia de dados
}

}
}

Para leitura: input stream


Para gravao: output stream

I/O Input Stream


}

Um programa utiliza um Input Stream para ler dados


de uma fonte, um item de cada vez

I/O Output Stream


}

Um programa utiliza um Output Stream para gravar


dados em um destino, um item de cada vez

Na nossa disciplina
}
}

Fonte e destino so 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.

Byte Streams
}

Permitem realizar entrada e sada de bytes de 8bits

ByteStream: Como funciona

Exemplo
}

Ver arquivo CopyBytes.java

NOTA: Mtodo read() retorna um int ao invs de um


byte
Isso acontece para que seja possvel o mtodo retornar
-1 quando o stream terminar
}

Consideraes sobre o exemplo


}

Sempre feche os streams utilizados


}

Ao fech-los, vc libera a memria consumida por eles

Pode ocorrer erro ao abrir o InputStream ou o


OutputStream (ou ambos)
}

Por isso importante testar se so diferentes de null antes de


fech-los

ByteStream
Muito baixo nvel
} Existem outros tipos de stream para tratar outros tipos
de dados
}

Mas so importantes porque todos os outros so


construdos sobre ele

Nosso arquivo exemplo um arquivo de texto, ento


vamos modificar o programa um pouco para tratar isso

Character Stream
Mesmo princpio de funcionamento do ByteStream
} Faz converso automtica da representao dos
caracteres em Java (que usa Unicode) para o enconding
de caracteres local
}

Ver aquivo CopyCharacter.java

Principais diferenas entre este exemplo e o anterior:


}
}

Uso de FileReader ao invs de FileInputStream


Uso de FileWriter ao invs de FileOutputStream

Entrada e Sada
}

Neste exemplo, o disco acessado para ler cada


caractere do arquivo, e depois novamente para gravar
cada caractere
}

MUITO LENTO!!

Soluo: utilizar BufferedStreams


}

O sistema operacional faz I/O apenas quando o Buffer est


vazio

I/O Orientada a linhas


Para arquivos texto, possvel ler linhas inteiras de uma
s vez, usando um buffer: BufferedReader (para leitura) e
PrintWriter (para gravao)
} Linha:
}

}
}
}

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


delimitada por CR ("\r")
delimitada por LF ("\n")

Ver arquivo CopyLines.java

Foco da disciplina
}

Arquivos binrios ao invs de arquivos texto

Como implementar um programa que grava registros de


funcionrios, e depois l esses registros?

Usar DataStreams
}

Possuem mtodos especficos para ler/gravar tipos especficos


(inteiro, string, etc)

DataStreams
}

Exemplo do funcionrio

Primeiro problema: em Java no existe o conceito de


registro
} Soluo de contorno:
}

Criar uma classe Funcionrio com os atributos do funcionrio

Classe Funcionrio
public class Funcionario {
public int codFuncionario;
public String nome;
public String cpf;
public String dataNascimento;
public float salario;
}
NOTA IMPORTANTE: no uma boa prtica de programao utilizar atributos
pblicos nas classes. Na disciplina, vamos adotar esta opo apenas para simplificar
os exemplos. O correto seria implementar mtodos get e set para cada atributo.

Manipulao
}

DataStream detecta final de arquivo lanando uma


exceo java.io.EOFException
}
}

Lgica para testar final de arquivo agora no mais baseada no


teste de valor -1
Capturar a exceo e fechar o DataStream

Ver arquivo ManipulaFuncionario.java

Exerccio
Alterar a classe ManipulaFuncionario para ler os dados do
funcionrio a ser gravado do teclado (ateno: criar uma
nova classe! No sobre-escrever a classe!)
} A cada funcionrio informado, perguntar se deseja ler os
dados de mais um funcionrio
}

}
}

Se sim, ler mais um funcionrio


Se no, gravar todos os funcionrios lidos

Orientao a objetos
}

Exemplo anterior fere os princpios de orientao a


objetos
}

Ideal dar a responsabilidade de ler registro e gravar registro


classe Funcionrio

Ver arquivo FuncionarioOO.java


Ver arquivo ManipulaFuncionarioOO.java

Flush
Os mtodos que utilizam buffer para gravao s fazem a
gravao em disco quando o buffer est cheio
} s vezes necessrio ter mais controle sobre quando os
dados realmente sero 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
operao println executada
Alternativa: Mtodo flush fora gravao do buffer em disco

Fonte
}

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

Pratique!
}

Execute os cdigos dos exemplos deste tutorial em casa

Exerccio
Modifique as classes para lidar com registros de contacorrente
} Dois arquivos:
}

}
}

}
}
}

Agncia (Cod, Nome, Gerente)


Conta-Corrente (Cod, CodAgencia, Saldo)

Usurio deve poder escolher o que quer cadastrar


Dados devem ser lidos do teclado
Aplicao deve ter opo de Cadastrar, Ler ou Sair