Arquivos em Java

Propaganda
BC-0502
Metodologia e Algoritmos Computacionais
Arquivos em Java
Santo André, Abril de 2008.
Roteiro
Hierarquia de Classes Java
Streams (fluxos)
Tipos de Arquivos
Arquivos Texto
Serialização
2
Hierarquia de Classes Java
http://java.sun.com/j2se/1.5.0/docs/api/overview-tree.html
3
Streams (Fluxos)
Java enxerga um arquivo como sendo um fluxo
(stream) seqüencial de bytes
Stream é um conceito poderoso que simplifica o
tratamento de operações de entrada e saída de
dados (I/O)
Streams são usados também para comunicação
entre computadores em uma rede
Java tem mais de 60 tipos de streams
Ou seja, mais de 60 classes para tratar de streams!
4
Streams de Bytes
Os programas usam streams de bytes para
realizar entrada e saída de bytes (ou seja,
seqüências de 8 bits)
Entrada
Super-classe: InputStream
Várias sub-classes para entrada de dados
Saída
Super-classe: OutputStream
Várias sub-classes para saída de dados
5
Streams de Caracteres
Programas usam streams de caracteres para
realizar operações de entrada e saída de dados
em caracteres de 16 bits (Unicode)
Entrada
Super-classe: Reader
Várias sub-classes para entrada de dados
Saída
Super-classe: Writer
Várias sub-classes para saída de dados
6
Classes InputStream
7
Classes InputStream
8
Classes OutputStream
9
Classes OutputStream
10
Classes Reader
11
Classes Reader
12
Classes Writer
13
Classes Writer
14
Streams de Conexão e de Cadeia
Streams de conexão (connection streams)
Conexão com fonte ou destino de dados
Especializados em escrever e ler dados em arquivos
Métodos de muito baixo nível
Ex: Escrever e ler um único byte
Streams de cadeia (chain streams)
Funciona se encadeados com streams de conexão
Proporcionam várias funcionalidades adicionais
Métodos mais sofisticados
Ex.: Ler e escrever um objeto inteiro ou ler e escrever uma
linha de texto
15
Persistência de Objetos
Lendo e Escrevendo Dados
Existem várias classes para trabalhar com
arquivos em Java
Classes existentes na API podem simplificar
muitas atividades
Duas abordagens são mais comuns para
implementar persistência de objetos
Armazenar dados em arquivos de texto
Usar serialização
16
Arquivos Texto
Os atributos dos objetos são salvos em arquivos
um por um, separados por algum caractere, como
“,” (virgula)
Um arquivo texto pode ser editado e visualizado
facilmente por humanos
Simples para fazer intercâmbio de dados entre
programas diferentes
17
Leitura de arquivo texto
com classes Reader
Leitura:
FileReader: stream de conexão
Uma operação de entrada lê um caractere
BufferedReader: entrada buferizada
Uma operação de entrada lê vários caracteres
Exemplo de código
FileReader f = new FileReader(“aquivo.txt");
BufferedReader br = new BufferedReader(f);
String linha = br.readLine();
18
Exemplo: Turma de alunos
public void importarAlunos(Turma minhaTurma){
BufferedReader br =
new BufferedReader(new FileReader("turma.txt"));
String linha;
String[] campos = null;
while ((linha = br.readLine()) != null){
campos = linha.split(":");
String nome = campos[0];
int idade = Integer.parseInt(campos[1]);
double nota = Double.parseDouble(campos[2].replace(",", "."));
minhaTurma.incluirAluno(nome, idade, nota);
}
br.close();
}
19
Escrita em arquivo texto
com classes Writer
Leitura:
FileWriter: stream de conexão
Uma operação de saída grava um caractere
BufferedWriter: saída buferizada
Uma operação de saída não grava necessariamente os dados, que
de tempos em tempos são enviados ao destino (disco)
PrintWriter: saída de objetos em texto
Oferece vários métodos para gravar dados
Exemplo de código
FileWriter f = new FileWriter(“arquivo.txt");
PrintWriter pw = new PrintWriter (f);
pw.println(“Hello World!”);
20
Exemplo: Turma de alunos
public void exportarAlunos(Aluno[] alunos, int nalunos){
PrintWriter pw = new PrintWriter(new
FileWriter("turma.txt"));
for (int i = 0; i < nalunos; i++){
String linha = String.format("%s:%d:%.1f",
alunos[i].getNome(), alunos[i].getIdade(),
alunos[i].getNota());
pw.println(linha);
}
pw.flush();
pw.close();
}
21
Arquivo Texto
Arthur:9:10,0
Gabriela:14:10,0
Nil:38:10,0
Maria:20:8,0
José:18:5,0
Joana:17:7,0
22
Serialização
Serialização é o processo de transformar um
objeto na memória para um streams de bytes
Deserialização é o processo inverso, de
reconstruir um objeto a partir de um stream de
bytes para o mesmo estado que o objeto estava
antes de ser serializado
Para um objeto ser serializado, a sua classe ou
alguma super-classe deve implementar a
interface Serializable
23
Serialização
Serialização (escrita)
FileOutputStream: stream de conexão
ObjectOutputStream: Stream que faz a serialização
Exemplo de código
FileOutputStream out = new FileOutputStream(“save.ser”);
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(new Date());
oos.close();
24
Exemplo: Turma de alunos
public void exportarAlunos(Aluno[] alunos, int nalunos){
ObjectOutputStream os = new ObjectOutputStream
(new FileOutputStream("Turma.ser"));
os.writeObject(nalunos);
for (int i = 0; i < nalunos; i++){
os.writeObject(alunos[i]);
}
os.close();
}
25
Classe aluno deve ser serializável
public class Aluno implements Serializable {
….
}
26
Deserialização
Deserialização (leitura)
FileInputStream: stream de conexão
ObjectInputStream: Stream que faz a deserialização
Exemplo de código
FileInputStream in = new FileInputStream( “save.ser” );
ObjectInputStream ois = new ObjectInputStream( in );
Date d = (Date) ois.readObject();
ois.close();
27
Exemplo: Turma de alunos
public void importarAlunos(Turma minhaTurma){
ObjectInputStream os = new ObjectInputStream
(new FileInputStream("Turma.ser"));
int numero = (Integer) os.readObject();
for (int i = 0; i < numero; i++){
Aluno a = (Aluno) os.readObject();
minhaTurma.incluirAluno(a);
}
os.close();
}
28
Serialização de objetos compostos
Se um objeto possui referências para outros
objetos (ou arrays), esses objetos são também
serializados
Se esses objetos, por sua vez, possuem referências
para outros objetos, esses também são serializados
E assim por diante
Essa abordagem pode ser usada, por exemplo,
para fazer cópias de objetos
29
Arquivo Serializado
¼φsrjava.lang.IntegerΓáñ≈üç8[1]Ivalue
xrjava.lang.Numberå¼ò
öαï[1]xp[1]sr
turma.Aluno▓≥Zu¬wkr[1]
IidadeD notaL
nomet Ljava/lang/String;xp @$tMariasq~
@"tJosé
30
BC-0502
Metodologia e Algoritmos Computacionais
Arquivos em Java
Santo André, Abril de 2008.
31
Download