Curso Superior de Tecnologia emtelemática Programação Orientada a Objetos Streams em Java Copyright 2010 Prof. César Rocha 1
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
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çãodeve trocarinformações com outros sistemas (muitas vezes não-oo)? 3
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
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ção. Dica: se arquivo.ser não existir no disco, ele será criado. 5
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; Dica: estes valores serão salvos em arquivo.ser public Cliente(){... public String import getnome(){ java.io.fileoutputstream; import java.io.ioexception; public void import setnome(string java.io.objectoutputstream; n){ public double getsalario(){ public void public setsalario(double class GravaCliente s){ { public String public tostring(){ 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(); 6
Importante E o queacontece quando o objeto possuivariáveis membros do tiporeferência (outros objetos)? Quandoum objeto é serializado, todaa árvore (hierarquia) que forma o objeto principal é serializada automaticamente Porém, os objetos membrostambém devem ser serializáveis, casocontráriouma exceção do tipo NotSerializableException será gerada. E o queacontece quando nãotemos acesso a classe membro para corrigir (alterar o código)? Podemosusar a herança de implementação (extends) 7
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 ❷ Criar um ObjectInputStream: ObjectInputStream ois = new FileInputStream( arquivo.ser ); ObjectInputStream(fis); ❸ Ler o objeto: Cliente novo = (Cliente) ois.readobject(); ❹ Fechar a conexão: ois.close(); Note a concatenação. Dica: os objetos devem ser lidos na mesma ordem em que foram gravados anteriormente (fila). 8
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 ❸ Gravar o texto: bw.write( Um texto ); ❹ Fechar a conexão: bw.close(); BufferedWriter(fw); Dica: O controle (separadores) deve ser feito pelo programador 9
Exemplo Lembre-se: o controle sobre toda a formataçãodo 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(); 10
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: quando não houver mais linhas, readline() retornará null 11
Exemplo O quê fazer paraextrair os dados em cima de cada uma das linhas presentes no arquivo? Use o método split() oua 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(); 12
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