java 05
TRANSCRIPT
1
Curso Superior de Tecnologia em TelemáticaProgramação Orientada a Objetos
Streams em Java
Copyright©2010Prof. César Rocha
2
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§ A diversidade de novas classes neste módulo é grande!
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)?
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
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 = newObjectOutputStream(fos);
� Gravar o objeto:Cliente c1 = new Cliente();oos.writeObject(c1);� Fechar a conexão:oos.close();
Note a concatenação. Note a concatenação.
Dica:Dica: se se arquivo.ser não existir não existir no disco, ele será criado. no disco, ele será criado.
Dica:Dica: se se arquivo.ser não existir não existir no disco, ele será criado. no disco, ele será criado.
6
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 em arquivo.ser
7
Importante
§ E o que acontece quando o objeto possui variáveismembros do tipo referência (outros objetos)?§ Quando um objeto é serializado, toda a árvore (hierarquia)
que forma o objeto principal é serializadaautomaticamente§ Porém, os objetos membros também devem ser
serializáveis, caso contrário uma exceção do tipoNotSerializableException será gerada.
§ E o que acontece quando não temos acesso a classemembro para corrigir (alterar o código)?§ Podemos usar a herança de implementação (extends)
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 = newFileInputStream(“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ção. Note a concatenaçã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).
9
Passos para gravar caracteres
§ Seguem os passos básicos necessários para escrever(enviar) um texto para um arquivo no disco:� Criar um FileWriterFileWriter 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
10
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(); }}
}
11
Passos para ler caracteres
§ Seguem os passos básicos necessários para ler(restaurar) um texto a partir de um arquivo:� Criar um FileReaderFileReader 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, linhas, readLinereadLine() retornará () retornará null
12
Exemplo
§ O quê fazer para extrair os dados em cima de cada umadas 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(); }}
}
13
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 avaliação.§ Este é apenas um dos assuntos abordados na prova!