Arquivos if669 - Introdução à Programação Monitoria de IP Igor Ebrahim (ies) Nicole Sultanum (nbs2) Paulo Borba (phmb)
Roteiro Persistência –Pra quê? Arquivos –TextFile –JavaFile –RandomFile
Persistência... pra quê? Não perder os dados no fim da execução de um programa –Memória temporária principal Mais rápida e cara –Memória permanente secundária mais lenta e barata
Arquivos Streams de bytes Não existem tipos Cadeias de bytes – como os dados são representados na memória
Arquivos TextFile JavaFile RandomJavaFile
TextFile Arquivos texto Legíveis por um ser humano Unidade básica: char
Exemplo TextFile public class TesteTextFile { public static void main(String args[]) { String str = "Testando a classe TextFile"; try { TextFile arquivo = new TextFile("java.in", "java.txt"); arquivo.writeString(str); arquivo.close(); } catch (FileNotFoundException e) { MiniJavaSystem console = new MiniJavaSystem(); console.println("O arquivo não foi achado!"); } catch (IOException e) { MiniJavaSystem console = new MiniJavaSystem(); console.println("Algum problema ocorreu."); }
JavaFile Arquivos binários Ilegíveis Escrita de Objetos –Serializable Unidade básica: byte
Exemplo public class TesteJavaFile { public static void main(String args[]) { Conta c1 = new Conta(123, "123-0"); try { JavaFile arquivo = new JavaFile("java.in", "java.txt"); arquivo.writeObject(c1); arquivo.close(); } catch (FileNotFoundException e) { MiniJavaSystem console = new MiniJavaSystem(); console.println("O arquivo não foi achado!"); } catch (IOException e) { MiniJavaSystem console = new MiniJavaSystem(); console.println("Algum problema ocorreu."); }
Random Java file TextFile e JavaFile acesso seqüencial –Escrita contínua RandomJavaFile Acesso randômico –Qualquer lugar do arquivo seek(long distancia) skipBytes(int distancia) Leitura (r) ex: readInt() –boolean byte char double int String … escrita (rw) ex: writeInt(int dado) –boolean char double int
Seqüencial x Randômico Acesso seqüencial Acesso randômico xy yx início
Revisão Qual o tamanho de um : –byte e boolean: 1 byte (8 bits) –char(Unicode) e short: 2 bytes (16 bits) –int e float: 4 bytes (32 bits) –double e long: 8 bytes (64 bits)
Exemplo RandomJavaFile (...) arquivo = new RandomJavaFile("java.bin", "r"); console.println("c1.saldo: " + arquivo.readInt()); console.println("c2.saldo: " + arquivo.readInt()); console.println("c1.numero: " + arquivo.readString()); console.println("c2.numero: " + arquivo.readString()); arquivo.close(); } catch (FileNotFoundException e) { console.println("O arquivo não foi achado!"); } catch (IOException e) { console.println("Algum problema ocorreu."); }
Exemplo Conta public class TesteRandomJavaFile { public static void main(String args[]) { Conta c1 = new Conta(123, "123-0"); Conta c2 = new Conta(456, "456-7"); MiniJavaSystem console = new MiniJavaSystem(); try { RandomJavaFile arquivo = new RandomJavaFile("java.bin", "rw"); arquivo.writeInt(c1.getSaldo()); arquivo.writeInt(c2.getSaldo()); arquivo.writeString(c1.getNumero()); arquivo.writeString(c2.getNumero()); arquivo.close(); (...)
Escrevendo chars public static void main(String args[]) { String a = ""; try { TextFile r = new TextFile("conta.out", "testeInteiroTexto.txt"); r.writeString(a); r.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
Escrevendo bytes public static void main(String[] args) { int a = 10000; try { RandomJavaFile r = new RandomJavaFile ("testeInteiroBinario.txt", "rw"); r.writeInt(a); r.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
java.io –InputStream OutputStream (abstratas) Leitura e escrita de arquivos binários –FileInputStream FileOutputStream leitura e escrita de bytes em arquivos –DataInputStream/DataOutputStream Escrita e leitura de tipos primitivos –ObjectInputStream/ObjectOutputStream Escrita e leitura de Objetos
java.io –Reader/Writer Leitura e escrita de texto –FileReader/FileWriter Leitura e escrita de texto em arquivos –BufferedReader/PrintWriter Escrita e leitura de Strings
Filtros Ler dados como bytes brutos é rápido, mas grosseiro; Normalmente, lêem-se os agregados de bytes que formam int s, float s, double s... Algumas classes são capazes de ler um conjunto de bytes e transformá-las para tipos primitivos. (Ex.: RandomJavaFile)
Buffering Transferência física de saída operação lenta se comparada com as velocidades do processador e da memória principal; Armazenamento em buffer (buffering) melhorias significativas de desempenho de entrada e saída; flush() força o envio a qualquer momento;
Buffering Escrita Leitura Arquivo
Buffering
Tipos Primitivos
Objetos
Resumindo Uso de arquivos para armazenar dados a longo prazo; Java vê cada arquivo como um fluxo seqüencial de bytes Os dados são representados na memória como bytes; Os dados em muitos arquivos seqüenciais não podem ser modificados sem o risco de destruir parte desses dados O arquivo geralmente é regravado por inteiro; Arquivos de acesso aleatório registros de tamanho fixo. TextFileJavaFileRandomJavaFile Arquivo de textoArquivo binário Legível por humanoNão legível por humano charbyte Acesso seqüencial Acesso aleatório