O documento apresenta os conceitos fundamentais sobre uso de streams de arquivos em Java, incluindo classes para abertura de conexões, leitura e gravação de objetos e caracteres. Exemplos mostram como serializar e desserializar objetos em arquivos e como ler e gravar texto usando streams. O leitor é incentivado a testar os exemplos e esclarecer dúvidas com o professor.
2. Objetivos
§ Explorar os conceitos fundamentais acerca do uso de
streams de arquivos em Java
§ Principais classes, abrindo conexões de streams, leitura e
gravação de objetos com streams, serialização e boas
práticas de programação.
§ Como trocar dados com outros programas não-Java
§ Leitura e gravação de texto e caracteres com streams
§ Exercícios e vários exemplos de códigos que você deve
testar visando solidificar seus conhecimentos
§ A diversidade de novas classes neste módulo é grande!
2
3. Motivação
§ Vimos que uma aplicação Java possui diversos objetos
cooperantes com estado e comportamento
§ Cada objeto é único e possui seus próprios dados
§ O quê fazer quando precisamos salvar todo o estado de
um (ou mais) objeto(s) no disco?
§ Aplicação bancária, onde todos os objetos Transação
devem ser gravados em um arquivo de lote diário
§ Um Jogo de computador, onde o estado atual de um
Personagem deve ser gravado para uma sessão futura
§ E quando a aplicação deve trocar informações com
outros sistemas (muitas vezes não-OO)? 3
4. Alternativas
§ Em Java, basicamente, há dois formatos possíveis para
gravar dados em arquivos, conforme a seguir:
Œ Serialização: um arquivo irá guardar uma fila de objetos
serializados. O conteúdo deste arquivo é quase ilegível, mas
natural à JVM. Quando há necessidade de recuperar o
objeto a partir do arquivo, ele é “inflado” e enviado para a
memória, automaticamente
• Texto/Caracteres: um arquivo irá guardar uma cadeia
de caracteres. Neste processo, o programador cria seu
formato pessoal de armazenamento e pode compreendê-lo.
Usa-se, geralmente, algum delimitador para materializar
este formato
4
5. Passos para gravar objetos
§ Seguem os passos básicos necessários para escrever
(enviar) um objeto para um arquivo no disco:
Œ Criar um FileOutputStream:
FileOutputStream fos = new
FileOutputStream(“arquivo.ser”);
• Criar um ObjectOutputStream:
ObjectOutputStream oos = new Note a concatenação.
ObjectOutputStream(fos);
Ž Gravar o objeto:
Cliente c1 = new Cliente();
oos.writeObject(c1);
• Fechar a conexão: Dica: se arquivo.ser não existir
no disco, ele será criado.
oos.close();
5
6. Interface Serializable
§ Se sua classe precisa ser serializada, implemente a
interface Serializable (marker interface)
public class Cliente implements Serializable {
public class Cliente implements Serializable {
private String nome;
private String nome; Dica: estes valores serão salvos
private double salario;
private double salario; em arquivo.ser
public Cliente(){...}
public Cliente(){...}
public import java.io.FileOutputStream;
import java.io.FileOutputStream;
String getNome(){…}
public String getNome(){…}
import java.io.IOException;
import java.io.IOException;
public
public void setNome(String n){…}
void setNome(String n){…}
import java.io.ObjectOutputStream;
import java.io.ObjectOutputStream;
public
public double getSalario(){…}
double getSalario(){…}
public
public public class GravaCliente {
void setSalario(double s){…}
public class GravaCliente {
void setSalario(double s){…}
public
public String toString(){…}main( String[] args ) {
public static void
String toString(){…}main( String[] args ) {
public static void
Cliente c = new Cliente();
Cliente c = new Cliente();
try {
try {
FileOutputStream fos = new FileOutputStream("arquivo.ser");
FileOutputStream fos = new FileOutputStream("arquivo.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(c);
oos.writeObject(c);
oos.close();
oos.close();
} catch ( IOException e ) { e.printStackTrace(); }
} catch ( IOException e ) { e.printStackTrace(); }
}
}
}
} 6
7. Importante
§ E o que acontece quando o objeto possui variáveis
membros do tipo referência (outros objetos)?
§ Quando um objeto é serializado, toda a árvore (hierarquia)
que forma o objeto principal é serializada
automaticamente
§ Porém, os objetos membros também devem ser
serializáveis, caso contrário uma exceção do tipo
NotSerializableException será gerada.
§ E o que acontece quando não temos acesso a classe
membro para corrigir (alterar o código)?
§ Podemos usar a herança de implementação (extends)
7
8. Passos para restaurar/ler objetos
§ Seguem os passos básicos necessários para ler
(restaurar) um objeto a partir de um arquivo:
Œ Criar um FileInputStream:
FileInputStream fis = new
FileInputStream(“arquivo.ser”);
• Criar um ObjectInputStream: Note a concatenação.
ObjectInputStream ois = new
ObjectInputStream(fis);
Ž Ler o objeto:
Cliente novo = (Cliente) ois.readObject();
Dica: os objetos devem ser lidos
• Fechar a conexão: na mesma ordem em que foram
ois.close(); gravados anteriormente (fila). 8
9. Passos para gravar caracteres
§ Seguem os passos básicos necessários para escrever
(enviar) um texto para um arquivo no disco:
Œ Criar um FileWriter
FileWriter fw = new
FileWriter(“arquivo.txt”);
• Concatená-lo com um BufferedWriter:
BufferedWriter bw = new
BufferedWriter(fw);
Ž Gravar o texto:
bw.write(“Um texto”); Dica: O controle (separadores)
deve ser feito pelo programador
• Fechar a conexão:
bw.close();
9
10. Exemplo
§ Lembre-se: o controle sobre toda a formatação do
arquivo (separadores, quebras de linha, etc) é tarefa do
programador do sistema
import
import java.io.BufferedWriter;
java.io.BufferedWriter;
import
import java.io.FileWriter;
java.io.FileWriter;
import
import java.io.IOException;
java.io.IOException;
public class GravaTexto {
public class GravaTexto {
public static void main( String[] args ) {
public static void main( String[] args ) {
try {
try {
FileWriter fw = new FileWriter("compras.txt");
FileWriter fw = new FileWriter("compras.txt");
BufferedWriter bw = new BufferedWriter(fw);
BufferedWriter bw = new BufferedWriter(fw);
bw.write("100"); bw.write(“#"); bw.write("Feijão"); bw.write("n");
bw.write("100"); bw.write(“#"); bw.write("Feijão"); bw.write("n");
bw.write("200"); bw.write(“#"); bw.write("Arroz"); bw.write("n");
bw.write("200"); bw.write(“#"); bw.write("Arroz"); bw.write("n");
bw.close();
bw.close();
} catch ( IOException e ) { e.printStackTrace(); }
} catch ( IOException e ) { e.printStackTrace(); }
}
}
}
}
10
11. Passos para ler caracteres
§ Seguem os passos básicos necessários para ler
(restaurar) um texto a partir de um arquivo:
Œ Criar um FileReader
FileReader fr = new
FileReader(“arquivo.txt”);
• Concatená-lo com um BufferedReader:
BufferedReader br = new
BufferedReader(fr);
Ž Lê o texto:
String s = br.readLine(); Dica: quando não houver mais
linhas, readLine() retornará null
• Fechar a conexão:
br.close();
11
12. Exemplo
§ O quê fazer para extrair os dados em cima de cada uma
das linhas presentes no arquivo?
§ Use o método split() ou a classe StringTokenizer
import java.io.BufferedReader;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.IOException;
public class LeTexto {
public class LeTexto {
public static void main( String[] args ) {
public static void main( String[] args ) {
try {
try {
FileReader fr = new FileReader("compras.txt");
FileReader fr = new FileReader("compras.txt");
BufferedReader br = new BufferedReader(fr);
BufferedReader br = new BufferedReader(fr);
String linha = null;
String linha = null;
while ( (linha = br.readLine()) != null ) {
while ( (linha = br.readLine()) != null ) {
String[] v = linha.split("#");
String[] v = linha.split("#");
for ( String dado : v ) System.out.println(dado);
for ( String dado : v ) System.out.println(dado);
}
}
br.close();
br.close();
} catch ( IOException e ) { e.printStackTrace(); }
} catch ( IOException e ) { e.printStackTrace(); }
}
}
}
} 12
13. Para um bom aproveitamento:
§ Codifique os exemplos mostrados nestes slides e
verifique pontos de dúvidas
§ Resolva todas as questões da lista de streams
§ Procure o professor ou monitor da disciplina e questione
conceitos, listas, etc.
§ Não deixe para codificar tudo e acumular assunto para
a avaliação.
§ Este é apenas um dos assuntos abordados na prova!
13