Buscar

Cap. 11 Fluxo de Dados Arquivos

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.

Outros materiais

Materiais relacionados

Perguntas relacionadas

Materiais recentes

Perguntas Recentes