BC-0502 Metodologia e Algoritmos Computacionais Arquivos em Java Santo André, Abril de 2008. Roteiro Hierarquia de Classes Java Streams (fluxos) Tipos de Arquivos Arquivos Texto Serialização 2 Hierarquia de Classes Java http://java.sun.com/j2se/1.5.0/docs/api/overview-tree.html 3 Streams (Fluxos) Java enxerga um arquivo como sendo um fluxo (stream) seqüencial de bytes Stream é um conceito poderoso que simplifica o tratamento de operações de entrada e saída de dados (I/O) Streams são usados também para comunicação entre computadores em uma rede Java tem mais de 60 tipos de streams Ou seja, mais de 60 classes para tratar de streams! 4 Streams de Bytes Os programas usam streams de bytes para realizar entrada e saída de bytes (ou seja, seqüências de 8 bits) Entrada Super-classe: InputStream Várias sub-classes para entrada de dados Saída Super-classe: OutputStream Várias sub-classes para saída de dados 5 Streams de Caracteres Programas usam streams de caracteres para realizar operações de entrada e saída de dados em caracteres de 16 bits (Unicode) Entrada Super-classe: Reader Várias sub-classes para entrada de dados Saída Super-classe: Writer Várias sub-classes para saída de dados 6 Classes InputStream 7 Classes InputStream 8 Classes OutputStream 9 Classes OutputStream 10 Classes Reader 11 Classes Reader 12 Classes Writer 13 Classes Writer 14 Streams de Conexão e de Cadeia Streams de conexão (connection streams) Conexão com fonte ou destino de dados Especializados em escrever e ler dados em arquivos Métodos de muito baixo nível Ex: Escrever e ler um único byte Streams de cadeia (chain streams) Funciona se encadeados com streams de conexão Proporcionam várias funcionalidades adicionais Métodos mais sofisticados Ex.: Ler e escrever um objeto inteiro ou ler e escrever uma linha de texto 15 Persistência de Objetos Lendo e Escrevendo Dados Existem várias classes para trabalhar com arquivos em Java Classes existentes na API podem simplificar muitas atividades Duas abordagens são mais comuns para implementar persistência de objetos Armazenar dados em arquivos de texto Usar serialização 16 Arquivos Texto Os atributos dos objetos são salvos em arquivos um por um, separados por algum caractere, como “,” (virgula) Um arquivo texto pode ser editado e visualizado facilmente por humanos Simples para fazer intercâmbio de dados entre programas diferentes 17 Leitura de arquivo texto com classes Reader Leitura: FileReader: stream de conexão Uma operação de entrada lê um caractere BufferedReader: entrada buferizada Uma operação de entrada lê vários caracteres Exemplo de código FileReader f = new FileReader(“aquivo.txt"); BufferedReader br = new BufferedReader(f); String linha = br.readLine(); 18 Exemplo: Turma de alunos public void importarAlunos(Turma minhaTurma){ BufferedReader br = new BufferedReader(new FileReader("turma.txt")); String linha; String[] campos = null; while ((linha = br.readLine()) != null){ campos = linha.split(":"); String nome = campos[0]; int idade = Integer.parseInt(campos[1]); double nota = Double.parseDouble(campos[2].replace(",", ".")); minhaTurma.incluirAluno(nome, idade, nota); } br.close(); } 19 Escrita em arquivo texto com classes Writer Leitura: FileWriter: stream de conexão Uma operação de saída grava um caractere BufferedWriter: saída buferizada Uma operação de saída não grava necessariamente os dados, que de tempos em tempos são enviados ao destino (disco) PrintWriter: saída de objetos em texto Oferece vários métodos para gravar dados Exemplo de código FileWriter f = new FileWriter(“arquivo.txt"); PrintWriter pw = new PrintWriter (f); pw.println(“Hello World!”); 20 Exemplo: Turma de alunos public void exportarAlunos(Aluno[] alunos, int nalunos){ PrintWriter pw = new PrintWriter(new FileWriter("turma.txt")); for (int i = 0; i < nalunos; i++){ String linha = String.format("%s:%d:%.1f", alunos[i].getNome(), alunos[i].getIdade(), alunos[i].getNota()); pw.println(linha); } pw.flush(); pw.close(); } 21 Arquivo Texto Arthur:9:10,0 Gabriela:14:10,0 Nil:38:10,0 Maria:20:8,0 José:18:5,0 Joana:17:7,0 22 Serialização Serialização é o processo de transformar um objeto na memória para um streams de bytes Deserialização é o processo inverso, de reconstruir um objeto a partir de um stream de bytes para o mesmo estado que o objeto estava antes de ser serializado Para um objeto ser serializado, a sua classe ou alguma super-classe deve implementar a interface Serializable 23 Serialização Serialização (escrita) FileOutputStream: stream de conexão ObjectOutputStream: Stream que faz a serialização Exemplo de código FileOutputStream out = new FileOutputStream(“save.ser”); ObjectOutputStream oos = new ObjectOutputStream(out); oos.writeObject(new Date()); oos.close(); 24 Exemplo: Turma de alunos public void exportarAlunos(Aluno[] alunos, int nalunos){ ObjectOutputStream os = new ObjectOutputStream (new FileOutputStream("Turma.ser")); os.writeObject(nalunos); for (int i = 0; i < nalunos; i++){ os.writeObject(alunos[i]); } os.close(); } 25 Classe aluno deve ser serializável public class Aluno implements Serializable { …. } 26 Deserialização Deserialização (leitura) FileInputStream: stream de conexão ObjectInputStream: Stream que faz a deserialização Exemplo de código FileInputStream in = new FileInputStream( “save.ser” ); ObjectInputStream ois = new ObjectInputStream( in ); Date d = (Date) ois.readObject(); ois.close(); 27 Exemplo: Turma de alunos public void importarAlunos(Turma minhaTurma){ ObjectInputStream os = new ObjectInputStream (new FileInputStream("Turma.ser")); int numero = (Integer) os.readObject(); for (int i = 0; i < numero; i++){ Aluno a = (Aluno) os.readObject(); minhaTurma.incluirAluno(a); } os.close(); } 28 Serialização de objetos compostos Se um objeto possui referências para outros objetos (ou arrays), esses objetos são também serializados Se esses objetos, por sua vez, possuem referências para outros objetos, esses também são serializados E assim por diante Essa abordagem pode ser usada, por exemplo, para fazer cópias de objetos 29 Arquivo Serializado ¼φsrjava.lang.IntegerΓáñ≈üç8[1]Ivalue xrjava.lang.Numberå¼ò öαï[1]xp[1]sr turma.Aluno▓≥Zu¬wkr[1] IidadeD notaL nomet Ljava/lang/String;xp @$tMariasq~ @"tJos├⌐ 30 BC-0502 Metodologia e Algoritmos Computacionais Arquivos em Java Santo André, Abril de 2008. 31