Baixe o app para aproveitar ainda mais
Prévia do material em texto
Isaias Camilo Boratti 11. Fluxos de Dados - Arquivos Fluxo --> stream – seqüência de bytes que podem ser obtidos/enviados de um arquivo ou conexão de rede ou mesmo um bloco de memória. Arquivo --> tecnicamente é uma seqüência de bytes. Entretanto, podemos pensar no mesmo como uma estrutura de nível mais alto, como sendo uma seqüência de caracteres ou objetos. Em Java, arquivos são representados por objetos. Assim, a leitura ou escrita em um arquivo implica na construção e utilização de objetos de determinadas classes encontradas no pacote java.io.*, tais como: FileInputStream, FileOutputStream, DataInputStream, ObjectInputStream, SequenceInputStream, etc. Isaias Camilo Boratti Em Java, as operações de entrada (E) ou saída (S) podem ser: a) baseada em bytes – visualiza o arquivo como uma seqüência de bytes lê bytes; escreve bytes b) baseada em caracteres – considera o arquivo como uma seqüência de caracteres no formato Unicode (2 bytes por caracter) lê caracter; escreve caracter Exemplo: import java.io.*; public class Principal { public static void main(String a[]) { int i; String s="c:\\java\\aplicacoes\\saida.txt"; try { FileOutputStream arqSaida = new FileOutputStream(s); for (i=0; i<10;i++) arqSaida.write(i); arqSaida.close(); } catch ( IOException ex ) { System.out.println("Problemas com abertura ou escrita...");} } } Classe só apresenta métodos para escrita de um byte (ou de um array de bytes). A criação do objeto arqSaida abre um novo arquivo (para escrita) conforme especificado por s. A maioria dos métodos apresenta assinatura que propaga possível exceção. Assim, deve-se usar o bloco try Superclasse de qualquer exceção de IO Isaias Camilo Boratti import java.io.*; public class Principal { public static void main(String arg[]) { int i; String s="c:\\java\\aplicacoes\\saida.txt"; try { FileInputStream arqEntrada = new FileInputStream(s); i=0; while (i!= -1){ i= arqEntrada.read(); System.out.println(i); } arqEntrada.close(); } catch (IOException ex) { System.out.println("Problemas com abertura ou leitura...");} } } Retorna –1 caso chegue no final do arquivo Exceção caso o arquivo não exista. Somente operações de leitura são permitidas. Isaias Camilo Boratti import java.io.*; public class Principal { public static void main(String a[]) { int i; String s="c:\\java\\aplicacoes\\saida.txt"; try { FileInputStream arqEntrada = new FileInputStream(s); FileOutputStream arqSaida = new FileOutputStream("copia"); i=0; while (i!= -1){ i= arqEntrada.read(); if (i!=-1) arqSaida.write(i); } arqSaida.close(); arqEntrada.close(); } catch (IOException ex) {System.out.println("Problemas abertura/leitura/escrita...");} } } Copia arquivo Escreve um byte Isaias Camilo Boratti As classes FileInputStream / FileOutputStream só apresentam métodos para leitura / escrita de um byte ou de um array de bytes. Se uma aplicação necessitar ler / escrever de um arquivo, valores de tipos primitivos da linguagem (int, double, char, etc.), necessitamos de objetos das classes DataInputStream e DataOutputStream. Estas classes apresentam métodos para ler um valor tipo int, escrever um valor tipo int, etc. Isaias Camilo Boratti import java.io.*; public class Principal { public static void main(String arg[]) { String s="c:\\java\\aplicacoes\\saida.txt"; String Nome = "Universidade Federal de Santa Catarina"; double orcamento = 1500456.30; int numeroServidores = 5000; char conceito = 'A' ; try { FileOutputStream arqSaida = new FileOutputStream(s); DataOutputStream dadosSaida = new DataOutputStream(arqSaida); dadosSaida.writeUTF(Nome); dadosSaida.writeDouble(orcamento); dadosSaida.writeInt(numeroServidores); dadosSaida.writeChar(conceito); dadosSaida.close(); } catch (IOException ex) { System.out.println("Problemas com abertura/escrita...");} } } Construtor tem como parâmetro um objeto classe FileOutputStream Isaias Camilo Boratti import java.io.*; public class Principal { public static void main(String arg[]) { String s = "c:\\java\\aplicacoes\\saida.txt"; String a; double b; int c; char d; try { DataInputStream dadosEntrada = new DataInputStream( new FileInputStream(s)); a = dadosEntrada.readUTF(); b = dadosEntrada.readDouble(); c = dadosEntrada.readInt(); d = dadosEntrada.readChar(); dadosEntrada.close(); System.out.println(a+" "+b+" "+" "+c+" "+d); } catch (IOException ex) { System.out.println("Problemas com abertura/leitura...");} } } Entrada baseada em bytes – Principais classes Classe abstrataInputStream DataInputStreamDataInput ObjectInputStream ObjectInput FilterInputStreamFileInputStream Interfaces Classe InputStream (abstrata) – Principais métodos public abstract int read() throws IOException Deve ser definido em subclasse. Deve ler um único byte do arquivo retornando um inteiro entre 0 e 255. É redefinido na classe FileInputStream. public int read(byte[] b) throws IOException, NullPointerException Lê um conjunto de até b.length bytes e armazena no array b. No nome do método retorna a quantidade de bytes lidos. Ocorre IOException se, por algum motivo, a operação de leitura não puder ser realizada. NullPointerException ocorre se b for null. public void close() throws IOException Fecha o fluxo de entrada. public int skip( long n) throws IOException Pula n bytes no fluxo de entrada. Retorna a quantidade de bytes efetivamente ignorados. Classe FileInputStream Define o método read(). Apresenta dois construtores: FileInputStream (String nome ) – constrói um objeto fluxo de entrada usando o arquivo cujo caminho/nome está especificado pelo string nome. FileInputStream (File f) – constrói um fluxo de entrada associado ao objeto f – a classe File será vista mais adiante. Classe FilterInputStream Redefine métodos da classe InputStream. Classe DataInputStream – Principais métodos Implementa métodos da interface DataInput que permitem a leitura de valores primitivos da linguagem. public DataInputStream (FileInputStream dadosEntrada) Constrói fluxo de entrada. Exige argumento da classe FileInputStream public boolean readBoolean() throws IOException Lê um byte que representa um valor boolean. Isaias Camilo Boratti public int readInt() throws IOException Lê quatro bytes que representam um valor tipo int. public int readFloat() throws IOException Lê quatro bytes que representam um valor tipo float. public int readDouble() throws IOException Lê oito bytes que representam um valor tipo double. public int readChar() throws IOException Lê dois bytes que representam um valor tipo char. public String readUTF() throws IOException Lê um string no formato UTF (Unicode Text Format). public long readLong() throws IOException Lê oito bytes que representam um valor tipo long. Observação: Uma exceção EOFException acontece se um operação de leitura for realizada e não houver bytes a serem lidos. Tal exceção pode ser usada para controlar EOF. long v; try { DataInputStream dadosEntrada = new DataInputStream( new FileInputStream(str)); boolean ler = true; while ( ler ) { try {v = dadosEntrada.readLong(); System.out.println(v); } catch (EOFException eof) { ler = false;} } dadosEntrada.close(); } catch (IOException ex) { System.out.println("Problemas com abertura/leitura/escrita...");} Saída baseada em bytes – Principais classes FilterOutputStream OutputStream FileOutputStream DataOutputStreamDataOutput ObjectOutputStream ObjectOutput Interfaces Classe abstrata Isaias Camilo Boratti Classe OutputStream (abstrata) – Principais métodos public abstractvoid write(int b) throws IOException Deve ser definido em subclasse. Deve escrever um único byte no arquivo (apenas os 8 bits de mais baixa ordem). É redefinido na classe FileOutputStream. public void write( byte[] b) throws IOException, NullPointerException Escreve os bytes do array b. Ocorre IOException se, por algum motivo, a operação de escrita não puder ser realizada. NullPointerException ocorre se b for null. public void close() throws IOException Esvazia o buffer e fecha o fluxo de saída. public void flush() throws IOException Esvazia o buffer. Classe FileOutputStream Define o método write para a escrita de um byte. Construtores: FileOutputStream (String nome ) – constrói um objeto fluxo de saída usando o arquivo cujo caminho/nome está especificado pelo string nome. Apaga automaticamente qualquer arquivo com o nome especificado. FileOutputStream (File f) – constrói um fluxo de saída associado ao objeto f. Também apaga o arquivo que porventura existir. Classe FilterOutputStream Redefine métodos da classe OutputStream. Classe DataOutputStream – Principais métodos Implementa métodos da interface DataOutput que permitem a escrita de valores primitivos da linguagem. public DataOutputStream (FileOutputStream dadosSaida) Constrói fluxo de saída. Exige argumento da classe FileOutputStream public void writeBoolean(boolean b) throws IOException Escreve o valor boolean b. Isaias Camilo Boratti public void writeInt(int va) throws IOException Escreve o valor int especificado por va. public void writeLong(long va) throws IOException Escreve o valor long especificado por va. public void writeFloat(float va) throws IOException Escreve o valor float especificado por va public void writeDouble(double va) throws IOException Escreve o valor double especificado por va public void writeChar(char va) throws IOException Escreve o valor char especificado por va public void writeUTF(String va) throws IOException Escreve o String especificado por va no formato UTF Isaias Camilo Boratti Saída baseada em caracteres – saída de texto Para termos uma saída na forma de texto, devemos ter um objeto da classe PrintWriter. Pode-se construí-lo das seguintes formas: PrintWriter saida = new PrintWriter ( new FileWriter(“saida.txt”)); PrintWriter saida = new PrintWriter (new FileOutputStream(“saida.txt”)) ; PrintWriter saida = new PrintWriter ( new FileWriter(“saida.txt”), true); /* Com o segundo argumento do construtor PrinWriter igual a true tem- se um escritor com auto esvaziamento do buffer (autoflush), isto é, não bufferizado*/ Para escrever no fluxo de saída usa-se os métodos print e println. Isaias Camilo Boratti Entrada baseada em caracteres – entrada de texto Para termos uma entrada na forma de texto devemos ter um objeto da classe BufferedReader. Pode ser construído conforme a seguir: BufferdReader entra= new BufferedReader (new FileReader(“entrada.txt”)); Para efetuar a leitura usa-se o método String readLine() que lê uma linha (um string) de texto. Este método retorna null quando não há uma entrada a ser lida. Isaias Camilo Boratti import java.io.*; public class Principal { public static void main(String[] aa) throws Exception { PrintWriter saida = new PrintWriter( new FileWriter ("saida.txt")); for (int i = 1; i<5 ; i++) saida.println(i); saida.close(); int valor , soma=0; BufferedReader en = new BufferedReader(new FileReader("saida.txt")); String s; s = en.readLine(); while (s != null) { valor = Integer.parseInt(s) ; soma += valor; s = en.readLine(); } System.out.println(soma); }} }} Propaga exceção Isaias Camilo Boratti Separadores de Strings Ao ler uma linha de um arquivo BufferdReader, através método readLine(), obtem-se um string extenso. A classe StringTokenizer (pacote java.util) apresenta uma forma fácil de separar as partes individuais de um string ( também denominadas “tokens”). Principais Métodos: StringTokenizer (String str, String delim) Constrói um objeto da classe que representa o string str com os delimitadores delim. Exemplo: StringTokenizer s=new StringTokenizer (“Curso Java”,” \n\t”); Delimitadores especificados: espaço, tabulação e enter Isaias Camilo Boratti boolean hasMoreTokens() Retorna true se o objeto tiver mais tokens. String nextToken() Retorna o próximo token do objeto. Ocorrerá exceção se não houver mais tokens. Exemplo: import java.util.*; .............................. String s = "Isto e um exemplo"; StringTokenizer t = new StringTokenizer(s," \n\r\t"); while (t.hasMoreTokens() ) { String s1 = t.nextToken(); System.out.println(s1); } Arquivos de acesso aleatório A classe RandomAccessFile permite construir objetos que representam arquivos em que se pode ler/escrever em qualquer lugar e não apenas sequencialmente. A classe RandomAccessFile implementa as interfaces DataInput e DataOutput. Assim para ler ou escrever em um arquivo de acesso aleatório utiliza-se os mesmos métodos de DataInputStream e DataOutputStream, ou seja, readInt, writeInt, readDouble, writeDouble, etc. Métodos da classe RandomAccessFile RandomAccessFile(String nome, String modo) Constrói o objeto associado ao arquivo físico nome. O parâmetro modo pode ser: “r” somente para leitura ou “rw” para leitura/escrita. public void seek( long quantBytes) Posiciona o ponteiro de leitura/escrita em quantBytes a partir do inicio do arquivo. public long getFilePointer() – posição atual do ponteiro em bytes. public long length() – retorna o tamanho do arquivo em bytes. Isaias Camilo Boratti String s="c:\\java\\aplicacoes\\saida.txt"; int valor; try { RandomAccessFile arquivo = new RandomAccessFile(s,"rw"); for (int i=0; i<10; i++) arquivo.writeInt(i); arquivo.seek(12); valor = arquivo.readInt(); valor = valor * 10; arquivo.seek(arquivo.getFilePointer()-4); arquivo.writeInt(valor); arquivo.seek(12); valor = arquivo.readInt(); System.out.println(" valor atualizado:"+valor); arquivo.close(); } catch (IOException ex) { System.out.println("Problemas com abertura/escrita/leitura...");} Posiciona o ponteiro de leitura ou escrita no décimo terceiro byte. Primeiro byte é 0. Retorna o ponteiro em 4 bytes Isaias Camilo Boratti Exercício: Escreva uma aplicação que leia do teclado nome e nota de um grupo de alunos e salve estas informações em um arquivo de acesso aleatório. Após, a aplicação deve ler do teclado nome e nova nota de um aluno e alterar esta nota no arquivo. Serialização de objetos Java apresenta as classes ObjectOutputStream e ObjectInputStream que permitem salvar e recuperar objetos. Classe ObjectOutputStream (métodos) public ObjectOutputStream( FileOutputStream saida) Constrói um objeto associado ao arquivo saida da classe FileOutputStream. public void writeObject(Object umObjeto) throws IOException Salva o objeto umObjeto. Classe ObjectInputStream (métodos) public ObjectInputStream (FileInputStream entrada) Constrói um objeto associado ao arquivo entrada da classe FileInputStream public Object readObject() throws IOException Recupera (lê) um objeto do arquivo. O objeto lido por meio de uma chamada ao método readObject() deve ser convertido para a classe desejada. Isaias Camilo Boratti import java.io.*; public class Principal { public static void main ( String ar[]) { Funcionario f1 = new Funcionario("Isaias",1000.00, 200.00); Funcionario f2 = new Funcionario("Maria" , 2000.00, 300.00); // Criação de um arquivo de saída String s = "c:\\java\\aplicacoes\\ArquivosObjetos\\saida.txt"; try { ObjectOutputStream saida = new ObjectOutputStream( new FileOutputStream(s)); saida.writeObject(f1); saida.writeObject(f2); saida.close(); } catch (IOException e) {System.out.println("Problemascom escrita no arquivo...");} } } import java.io.*; public class Principal { public static void main ( String ar[]) { String s = "c:\\java\\aplicacoes\\ArquivosObjetos\\saida.txt"; Funcionario f; try { ObjectInputStream entrada = new ObjectInputStream( new FileInputStream(s)); while (true) { try { f = (Funcionario)entrada.readObject(); System.out.println(f.informeNome()+" "+ f.fornecaSalarioTotal()); } catch (Exception e) { break;} } } catch (IOException e) { System.out.println(" Problemas com abertura/leitura..."); } }} Isaias Camilo Boratti import java.io.*; // interface Serializable public class Funcionario implements Serializable { protected String nome; protected Salario sal; ............. ............. } import java.io.*; public class Salario implements Serializable { ............. ............. } Para tornar possível a serialização de objetos desta classe. Esta interface não apresenta métodos. Deve ser utilizada por questões de segurança. Veja Horstmann – cap 12. A classe File (Gerenciamento de arquivo) Java apresenta a classe File que disponibiliza métodos que permitem operações tais como: ver se um arquivo existe, saber quando o arquivo foi modificado pela última vez, alterar o nome de um arquivo, etc. Principais métodos: public File (String str) Constrói um objeto associado ao arquivo definido por str. Veja que o objetivo não é criar o arquivo str. public File(String caminho, String nome) Construtor. Especifica-se o caminho e o nome do arquivo. public boolean canRead() Indica se o arquivo pode ser lido pelo aplicativo atual. public boolean canWrite() Indica se o arquivo pode ser alterado. public boolean delete() Tenta remover o arquivo. Caso consiga retorna true. public boolean exists() Retorna true se o arquivo ou diretório existirem. public String getPath() Retorna o nome do caminho. public String getName() Retorna o nome do arquivo (sem o caminho). public boolean isDirectory() Retorna true se o objeto da classe File representar um diretório. public boolean isFile() Retorna true se o objeto for um arquivo public boolean isHidden() Retorna true se objeto File representar um arquivo ou diretório oculto. public long lastModified() Retorna data/hora da última modificação. Retorna 0 se não existir. Isaias Camilo Boratti public long length() Retorna o tamanho do arquivo em bytes, ou 0 se o arquivo não existe. public boolean mkdir() Cria um subdiretório cujo nome é dado pelo objeto File. Retorna true se o subdiretório foi criado com sucesso. public boolean renameTo( File nomenovo) Altera o nome do arquivo representado pelo objeto para o nome definido por outro objeto File. Retorna true se nome foi alterado.
Compartilhar