1
Streams de
arquivos em Java
Cesar Rocha alunoscesar@gmail.comStreams
Streams
de
de
arquivos em Java
arquivos em Java
Cesar Rocha Cesar Rocha alunoscesar@gmail.com alunoscesar@gmail.com2
Objetivos
§ Explorar os conceitos fundamentais acerca do uso
de streamsstreams 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
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
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
5
Streams
§ Você pode pensar em uma stream como um cano
por onde fluem dados:
§ Cada cano é ligado a outro (concatenado)
Arquivo FileI nput Stre am(F ile) Inpu tStre amRe ader (File Inpu tStre am) Buffe redR eade r(Inp utSt ream Read er)
6
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
ObjectOutputStream(fos);
Ž Gravar o objeto:
Cliente c1 = new Cliente();
oos.writeObject(c1);
• Fechar a conexão:
oos.close();
Note a concatena Note a concatenação. ção.
Dica:
Dica: se se arquivo.ser não existir não existir
no disco, ele ser
no disco, ele seráá criado. criado.
Dica:
Dica: se se arquivo.ser não existir não existir
no disco, ele ser
7
Interface Serializable
§ Se sua classe precisa ser serializada, implemente a interface Serializable (marker interface)
public class Cliente implements Serializable { private String nome;
private double salario; public Cliente(){...}
public String getNome(){…}
public void setNome(String n){…} public double getSalario(){…}
public void setSalario(double s){…} public String toString(){…}
public class Cliente implements Serializable { private String nome;
private double salario; public Cliente(){...}
public String getNome(){…}
public void setNome(String n){…} public double getSalario(){…}
public void setSalario(double s){…} public String toString(){…}
import java.io.FileOutputStream; import java.io.IOException;
import java.io.ObjectOutputStream; public class GravaCliente {
public static void main( String[] args ) { Cliente c = new Cliente();
try {
FileOutputStream fos = new FileOutputStream("arquivo.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(c); oos.close();
} catch ( IOException e ) { e.printStackTrace(); } }
}
import java.io.FileOutputStream; import java.io.IOException;
import java.io.ObjectOutputStream; public class GravaCliente {
public static void main( String[] args ) { Cliente c = new Cliente();
try {
FileOutputStream fos = new FileOutputStream("arquivo.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(c); oos.close();
} catch ( IOException e ) { e.printStackTrace(); } }
}
Dica:
Dica: estes valores serão salvos estes valores serão salvos em
8
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)?
9
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:
ObjectInputStream ois = new
ObjectInputStream(fis);
Ž Ler o objeto:
Cliente novo = (Cliente) ois.readObject();
• Fechar a conexão:
ois.close();
Note a concatena Note a concatenação. ção.
Dica:
Dica: os objetos devem ser lidos os objetos devem ser lidos na mesma ordem em que foram na mesma ordem em que foram gravados anteriormente (fila). gravados anteriormente (fila).
10
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”);
• Fechar a conexão:
bw.close();
Dica:
Dica: O controle (separadores) O controle (separadores) deve ser feito pelo programador deve ser feito pelo programador
11
Exemplo
§
§ LembreLembre--se:se: o controle sobre toda a formatação do
arquivo (separadores, quebras de linha, etc) é tarefa do programador do sistema
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class GravaTexto {
public static void main( String[] args ) { try {
FileWriter fw = new FileWriter("compras.txt"); BufferedWriter bw = new BufferedWriter(fw);
bw.write("100"); bw.write(“#"); bw.write("Feijão"); bw.write("\n"); bw.write("200"); bw.write(“#"); bw.write("Arroz"); bw.write("\n"); bw.close();
} catch ( IOException e ) { e.printStackTrace(); } }
}
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class GravaTexto {
public static void main( String[] args ) { try {
FileWriter fw = new FileWriter("compras.txt"); BufferedWriter bw = new BufferedWriter(fw);
bw.write("100"); bw.write(“#"); bw.write("Feijão"); bw.write("\n"); bw.write("200"); bw.write(“#"); bw.write("Arroz"); bw.write("\n"); bw.close();
} catch ( IOException e ) { e.printStackTrace(); } }
12
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(); • Fechar a conexão: br.close(); Dica:
Dica: quando não houver mais quando não houver mais linhas,
13
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.FileReader; import java.io.IOException; public class LeTexto {
public static void main( String[] args ) { try {
FileReader fr = new FileReader("compras.txt"); BufferedReader br = new BufferedReader(fr); String linha = null;
while ( (linha = br.readLine()) != null ) { String[] v = linha.split("#");
for ( String dado : v ) System.out.println(dado); }
br.close();
} catch ( IOException e ) { e.printStackTrace(); } }
}
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class LeTexto {
public static void main( String[] args ) { try {
FileReader fr = new FileReader("compras.txt"); BufferedReader br = new BufferedReader(fr);
String linha = null;
while ( (linha = br.readLine()) != null ) { String[] v = linha.split("#");
for ( String dado : v ) System.out.println(dado); }
br.close();
} catch ( IOException e ) { e.printStackTrace(); } }
14
Para um bom aproveitamento:
Para um bom aproveitamento:
§ Codifique os exemplos mostrados nestes slides e verifique pontos de dúvidas
§ Resolva todas as questões da lista de lista de streamsstreams § Procure o professor ou monitor da disciplina e
questione conceitos, listas, etc.
§ Não deixe para codificar tudo e acumular assunto
para a primeira avaliação.