Gravação de objetos em arquivos Programação Orientada a Objetos Prof. Tulio Alberton Ribeiro Instituto Federal de Santa Catarina – IFSC campus São José [email protected] 17 de setembro de 2014 1 / 23 java.io.Serializable; Serialização / DeSerialização A chave para armazenar e recuperar a informação contida em objetos Java é através de serialização. 2 / 23 java.io.Serializable; Serialização / DeSerialização A chave para armazenar e recuperar a informação contida em objetos Java é através de serialização. Serializar a informação, é armazená-la junto com informação suficiente para poder reconstruı́-la. 2 / 23 java.io.Serializable; Serialização / DeSerialização A chave para armazenar e recuperar a informação contida em objetos Java é através de serialização. Serializar a informação, é armazená-la junto com informação suficiente para poder reconstruı́-la. O stream de bytes de um objeto salvo, inclue informação suficiente para que os campos, atributos, métodos, assim como todo o objeto possa ser reconstruı́do. 2 / 23 java.io.Serializable; Serialização / DeSerialização A chave para armazenar e recuperar a informação contida em objetos Java é através de serialização. Serializar a informação, é armazená-la junto com informação suficiente para poder reconstruı́-la. O stream de bytes de um objeto salvo, inclue informação suficiente para que os campos, atributos, métodos, assim como todo o objeto possa ser reconstruı́do. Um stream de bytes representa um fluxo de dados, ou um canal de comunicação, com processos lendo em um lado do fluxo e outros escrevendo na outra ponta, conceitualmente. 2 / 23 Serialização e Deserialização 4 / 23 Classe Pessoa.java 0 import java.io.Serializable; 1 2 3 4 public class Pessoa implements Serializable{ private String nome; private String cpf; 5 public Pessoa(String nome, String cpf) { this.nome = nome; this.cpf = cpf; } public void imprimir(){ System.out.println("Nome: " + nome); System.out.println("CPF: " + cpf); } 6 7 8 9 10 11 12 13 14 } A interface java.io.Serializable permite que objetos sejam serializados, ou seja, permite que esses objetos sejam gravados em arquivos, transmitidos pela rede, armazenados em memória, etc. 6 / 23 Classe Principal.java 14 15 16 public class Principal { /* Criando um vetor de tamanho 2 */ private Pessoa[] agenda = new Pessoa[2]; 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 public void salvarEmDisco(){ //código próximas l^ aminas } public void lerDoDisco(){ //código próximas l^ aminas } public static void main(String[] args) { Principal p = new Principal(); p.agenda[0] = new Pessoa("Jo~ ao", "123.734.734-33"); p.agenda[1] = new Pessoa("Maria", "354.021.456-12"); p.salvarEmDisco(); p.lerDoDisco(); } }//fim da classe 8 / 23 Trecho de código para gravar objeto em arquivo 31 32 33 34 35 public void salvarEmDisco() { File arquivo = new File("meusDados.txt"); try { FileOutputStream FOS = new FileOutputStream(arquivo); ObjectOutputStream OOS = new ObjectOutputStream(FOS); 36 // gravando o vetor 'pessoa' no arquivo chamado meusDados.txt' OOS.writeObject(this.pessoa); 37 38 ' 39 OOS.flush(); // limpando dados em buffer OOS.close(); // fechando fluxo de saı́da FOS.close(); // fechando arquivo } catch (IOException ex) { System.err.println("erro: " + ex.toString()); } 40 41 42 43 44 45 46 } 10 / 23 Trecho de código para ler objeto de um arquivo 46 47 48 49 50 public void lerDoDisco() { File arquivo = new File("meusDados.txt"); try { FileInputStream FIS = new FileInputStream(arquivo); ObjectInputStream OIS = new ObjectInputStream(FIS); 51 // Lendo os objetos de um arquivo this.pessoa = (Pessoa[]) OIS.readObject(); OIS.close(); //fechando fluxo de entrada FIS.close(); //fechando arquivo 52 53 54 55 56 // Uma forma de diferente do for para percorrer vetores for (Pessoa p : this.pessoa) { p.imprimir(); } } catch (ClassNotFoundException ex) { System.err.println("erro: " + ex.toString());} catch (IOException ex) { System.err.println("erro: " + ex.toString());} 57 58 59 60 61 62 63 64 65 } 12 / 23 Escrevendo e Lendo em arquivos. Crie outra classe Principal, chamada Principal2 e altere os métodos lerDoDisco e salvarEmDisco. Copie os trechos de código das próximas lâminas e substitua no arquivo Principal2. Rode uma vez, e em seguida comente o método salvarEmDisco, altere o conteúdo do arquivo meusDados.txt manualmente. Após alterado, rode o programa. 13 / 23 Trecho de código para ler conteúdo de um arquivo 65 66 67 68 69 70 public void lerDoDisco() { try { InputStream is = new FileInputStream("meusDados.txt"); //InputStream is = System.in; InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); 71 String s = br.readLine(); // primeira linha while (s != null) { System.out.println(s); s = br.readLine(); } br.close(); }catch(java.io.FileNotFoundException FNE){ System.out.println("Arquivos n~ ao encontrado!");} catch (IOException ex) { System.err.println("erro: " + ex.toString());} 72 73 74 75 76 77 78 79 80 81 82 } Unicode..., UTF-8, ISO-8859-1, UTF-16 15 / 23 Composição da classe para ler conteúdo de um arquivo 17 / 23 Composição da classe para ler teclado ou conteúdo de um arquivo 19 / 23 Trecho de código para gravar conteúdo em um arquivo 82 String toSave = "Informaç~ ao em texto puro a ser salva."; 83 84 85 86 87 88 public void salvarEmDisco() { try { OutputStream os = new FileOutputStream("meusDados.txt") ; OutputStreamWriter osw = new OutputStreamWriter(os); BufferedWriter bw = new BufferedWriter(osw); 89 bw.write("Info: "+ this.toSave); 90 91 bw.close(); } catch (IOException ex) { System.err.println("erro: " + ex.toString()); } 92 93 94 95 96 } 21 / 23 Composição da classe para ler teclado ou conteúdo de um arquivo 23 / 23