Curso Superior de Tecnologia em Telemá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ção deve trocar informaçõ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          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
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
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
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
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
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
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
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
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

Java 05

  • 1.
    Curso Superior deTecnologia em Telemática Programação Orientada a Objetos Streams em Java Copyright©2010 Prof. César Rocha 1
  • 2.
    Objetivos § Explorar osconceitos 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 queuma 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 gravarobjetos § 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 § Sesua 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 oque 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/lerobjetos § 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 gravarcaracteres § 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: ocontrole 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 lercaracteres § 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 bomaproveitamento: § 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