Você está na página 1de 83

Streams e E/S em Java

Prof. Ricardo Linden


(baseado em transparncias de Walter Savitch)

E/S em Java

Viso Geral de E/S

E/S = Entrada e Sada (Em ingls I/O=Input/Output) A entrada normalmente feita atravs de teclado ou arquivos. A sada normalmente feita para a tela, arquivos ou impressora. Vantagens da E/S podemos fazer uma cpia permanente uma sada de um programa pode ser a entrada de outro. A entrada pode ser automatizada (em vez de feita manualmente)
E/S em Java

Streams

Stream: um objeto que fornece dados para seu destino (tela, arquivos, etc.) ou recebe dados de sua fonte (teclado, arquivo, etc) funciona como um buffer entre a fonte de dados e o destino. conecta um programa a um objeto de E/S. conceito similar aos file-handlers das linguagens imperativas que vimos at hoje. Input stream: stream que fornece entrada para um programa. Output stream: stream que recebe sada de um programa
E/S em Java

Arquivos texto e binrios

Todos os arquivos e programas, no fundo, so apenas colees de zeros e uns. Cada dgito s pode ter dois valores (da a denominao do sisetma binrio) bit (binary digit) um dgito enquanto que byte um grupo de oito bits Arquivos texto: os bits representam caracteres visualizveis. Se usamos ASCII, usamos um byte por caracter. So criados com editores de texto padro. Exemplo: arquivos fonte do Java.
E/S em Java

Arquivos texto e binrios

Arquivos binrios: os bits representam outros tipos de informao codificada, tais como instrues executveis, dados numricos, etc. Estes arquivos so facilmente legveis por computadores mas no por hmanos. Eles no so arquivos imprimveis ("printable)
isto no quer dizer que eles no possam ser impressos, mas sim, que se o forem, eles no sero inteligveis. "printable" significa facilmente lido e compreendido por humanos quando impressos.

E/S em Java

Arquivos texto e binrios

Exemplo de visualizao de arquivo binrio:

Para ns incompreensvel, mas o programa certo (no caso Winzip ou similar) decodifica-o sem problemas.
E/S em Java

Java: Arquivos texto versus binrios


Arquivos texto so mais facilmente lidos por humanos, podendo ser visualmente inspecionados. Arquivos binrios so mais eficentes, pois j esto na linguagem do computador. Escrita e leitura de arquivos binrios feita por programas Arquivos texto so usados apenas para comunicao com humanos. Os arquivos binrios Java so portteis podem ser usados pelo Java em diferentes mquinas

E/S em Java

Java: Arquivos texto versus binrios


Arquivos texto Java

Arquivos binrios em Java

Arquivos fonte (.java) Ocasionalmente arquivos de entrada e sada

Arquivos executveis (.class) criados pela compilao dos arquivos fonte Usualmente arquivos de entrada e sada.

Arquivos binrios tendem a ser menores do que arquivos texto com o mesmo contedo e a operao com aqueles tende a ser mais rpida.
E/S em Java

Entrada e Sada com Arquivos Texto

E/S em Java

E/S em geral
Para usar todas as classes que descreveremos aqui, precisamos acrescentar a seguinte linha a nossos programas: import java.io.*;

E/S em Java

10

E/S com arquivos texto

Classes importantes para sada em modo texto PrintWriter FileOutputStream Classes importantes para entrada em modo texto: BufferedReader FileReader FileOutputStream e FileReader so usados apenas pelos seus construtores, que recebem nomes de arquivos como argumentos. Os construtores das classes PrintWriter e BufferedReader no recebem nomes de arquivos como argumento, mas sim streams.
E/S em Java

11

Todo arquivo tem dois nomes

O cdigo usado para abrir um arquivo gera dois nomes para um arquivo de sada. O nome usado pelo sistema operacional out.txt, por exemplo o nome da stream outputStream, por exemplo

Os programas Java usam o nome da stream O conceito extremamente similar maneira com que lidvamos com file handlers. Em cada instante, um stream est associado com apenas um arquivo fsico, mas podemos mudar esta associao facilmente.
E/S em Java

12

Sada em modo texto

Para abrir um arquivo texto para sada: crie uma stream da classe PrintWriter e conectea a um arquivo texto Nome da stream onde escreveremos Exemplo: Printwriter outputStream = new PrintWriter(FileOutputStream(out.txt))
Construtor de PrintWriter no recebe o nome de arquivo como parmetro Nome Fsico

Agora podemos usar print e println para escrever no arquivo


E/S em Java

13

Fechando um arquivo

Um arquivo de entrada ou de sada deve ser fechado quando terminamos de us-lo.

Lembrem-se do que a Tia Noca ensinou: Depois de usar, guarde no mesmo lugar!

E/S em Java

14

Fechando um arquivo

Para fechar o arquivo use o mtodo close da classe PrintWriter (BufferedReader tambm tem um mtodo close). Por exemplo, para fechar o arquivo que abrimos no cdigo acima, usamos: outputStream.close(); Se o programa fechar normalmente, ele fechar todos os arquivos que ainda estiverem abertos (parte do servio de garbage colletion).
E/S em Java

15

Pergunta razovel...

Se um programa que termina normalmente fecha todos os arquivos abertos, porque temos que fech-los explicitamente com o mtodo close?

Duas razes: 1. Para garantir que o arquivo est fechado se o programa terminar de forma anormal (ele poderia ter parte do contedo perdido, neste caso.

Aguardem ansiosamente a aula de excees para que discutamos mais estes tpicos...
E/S em Java

16

Pergunta razovel

Se um programa que termina normalmente fecha todos os arquivos abertos, porque temos que fech-los explicitamente com o mtodo close?

Duas razes: 2. Um arquivo aberto para escrita tem que ser fechado antes de poder ser aberto para leitura
Java tem uma classe que serve para abrir um arquivo tanto para leitura quanto para escrita (detalhes mais frente)

E/S em Java

17

Exemplo 1

import java.io.*; import javax.swing.JOptionPane; public class FileIO1 { public static void main(String[] args) { Tem que ser fora do bloco do try. PrintWriter outputStream = null; try { outputStream = new PrintWriter(new FileOutputStream("out.txt")); } Criando o arquivo catch(FileNotFoundException e)Erro { causado quando no d para criar o arquivo System.out.println("Erro criando o arquivo de sada."); System.exit(0); } String line = null; int count; for (count = 1; count <= 3; count++) { line = JOptionPane.showInputDialog("Entre uma linha : "); outputStream.println(count + " " + line); } Gravando as linhas outputStream.close(); No devemos esquecer de fechar a stream System.exit(0); } E/S em Java
18

Exemplo de Sada do Programa

E/S em Java

19

Entrada no modo texto

Para abrir um arquivo para entrada, conecte um arquivo texto a uma stream para leitura. Use uma stream da classe BufferedReader e conecte-a ao arquivo texto Use a classe FileReader para conectar o objeto BufferedReader ao arquivo texto Por exemplo:
BufferedReader inputStream = new BufferedReader(new FileReader("data.txt") );

E/S em Java

20

Entrada e Sada

Os projetistas do Java desta vez nos deram um pouquinho de dor de cabea... Lembrem-se : os construtores de BufferedReader e PrintWriter no recebem o nome do arquivo a ser usado como parmetro. Cada um tem um tipo de parmetro diferente: PrintWriter FileOutputStream BufferedReader FileReader

E/S em Java

21

Entrada e Sada

Reclamaes diretamente com a Sun, por favor. E no esqueam de me incluir em seu abaixoassinado!

E/S em Java

22

Entrada no modo texto

Depois de abrir o arquivo: leia linhas (Strings) com o mtodo readLine BufferedReader no tem nenhum mtodo para ler nmeros diretamente, logo leia nmeros como Strings e depois converta-os. Leia um char com o mtodo read

E/S em Java

23

Exemplo 2
import java.io.*; public class FileIO2 { public static void main(String[] args) { try { BufferedReader inputStream=new BufferedReader(new FileReader("data.txt")); String line = null; line = inputStream.readLine(); System.out.println("Primeira linha:"+line); line = inputStream.readLine(); System.out.println("Segunda linha"+line); inputStream.close(); } catch(FileNotFoundException e) { System.out.println("No achei ou consegui abri o arquivo"); } catch(IOException e) { System.out.println("Erro genrico ao ler o arquivo"); } } }
E/S em Java

24

Sada do nosso exemplo

E/S em Java

25

Alguns mtodos na classe BufferedReader

BufferedReader(Reader readerObject) o nico construtor que precisaremos no h nenhum construtor que aceite um nome de arquivo como argumento

new BufferedReader(new FileReader(File_Name))


Se voc quiser criar uma stream com um argumento, use este formato. FileReader descendente da classe Reader Uma exceo da classe FileNotFoundException (um tipo de IOException) pode ser lanada (veremos mais sobre excees mais frente.
E/S em Java

26

Alguns mtodos na classe BufferedReader

public String readLine() throws IOException Retorna uma linha lida de uma stream de entrada. Se a leitura for feita aps o fim do arquivo, ento o retorno null.

public int read() throws IOException

L um nico caracter da stream de entrada e retorna o caracter como um valor int.


Se a leitura feita aps o fim do arquivo, o retorno igual a 1.

public void close() throws IOException Fecha a stream


E/S em Java

27

Nota : Dividindo uma string usando a classe StringTokenizer

Existem mtods na classe BufferedReader que lem um caracter e mtodos que lem uma linha, mas no mtodos que leiam uma nica palavra. Para dividir uma linha em palavras ns podemos usar a classe StringTokenizer
Ela definida dentro da biblioteca util
Logo, para us-la temos que acrescentar ao nosso programa a linha import java.util.* Vamos v-la atravs de um exemplo mais detalhes em http://www.sun.com No construtor ns podemos especificar os delimitadores de palavras (os delimitadores padro so os caracteres de espao branco (espao, tab e newline)
E/S em Java

28

Exemplo: StringTokenizer

Mostrar as palavras separadas pelos seguintes caracteres: espao, newline (\n), ponto ou vrgula.
String inputLine = SavitchIn.readLine(); StringTokenizer wordFinder = new StringTokenizer(inputLine, " \n.,"); //the second argument is a string of the 4 delimiters while(wordFinder.hasMoreTokens()) { System.out.println(wordFinder.nextToken()); } Question 2b or !tooBee
29

Se entrarmos com a string "Question,2b.or !tooBee." a sada ser a seguinte


E/S em Java

Como saber se um arquivo terminou?

H vrias maneiras de saber se uma rquivo j acabou. Podemos por exemplo colocar um caracter especial no fim do arquivo (caso do Pascal antigo) Quando o readLine tenta ler aps o trmino do arquivo ele retorna null, logo podemos testar pela sua ocorrncia idem para o read (retorna -1 quando o arquivo j acabou) Nenhum dos dois mtodos causa um exceo da classe EOFException.
E/S em Java

30

Exemplo: Usando Null para testar para o fim do arquivo


Quando usar readLine teste para null

int count = 0; String line = inputStream.readLine(); while (line != null) { count++; outputStream.println(count + " " + line); line = inputStream.readLine(); }

Quando usar read teste para -1


E/S em Java

31

Exemplo 3
import java.io.*; public class TextEOFDemo { public static void main(String[] args) { try { BufferedReader inputStream = new BufferedReader(new FileReader("data.txt")); int count = 0; String line = inputStream.readLine(); while (line != null) { count++; System.out.println(count + " " + line); line = inputStream.readLine(); } System.out.println("O arquivo tinha "+count+" linhas."); inputStream.close(); } catch(FileNotFoundException e) { System.out.println("Nao achei o arquivo de entrada."); } catch(IOException e) { System.out.println("Erro lendo do arquivo de entrada.");} } } E/S em Java

32

Exemplo de execuo

E/S em Java

33

Entrada e Sada no modo binrio


Existe muita similaridade entre os modos texto e binrio, logo muitas transparncias sero repetitivas.

E/S em Java

34

E/S em modo binrio

Classes importantes para sada em modo binrio: DataOutputStream FileOutputStream Classes importantes para entrada em modo binrio: DataInputStream FileInputStream Note que FileOutputStream e FileInputStream so usados apenas pelos seus construtores, que podem receber como argumentos os nomes dos arquivos.

E/S em Java

35

Nova Reclamao Sun

A Sun insistiu com seu maravilhoso conceito de no permitir nomes de arquivos nos construtores das streams. Eu mantenho-me fiel minha reclamao

E/S em Java

36

Lembrando
Para usar estas classes precisamos preceder nossas classes pela declarao: import java.io.*;

E/S em Java

37

Classes de Stream do Java

DataInputStream e DataOutputStream: ambas tm mtodos para ler e escrever os dados um byte de cada vez. Automaticamente convertem nmeros e caracteres em cdigo binrio
como j vimos, arquivos binrios no so legveis por um editor, mas so armazenados de forma mais eficiente.

E/S em Java

38

S para lembrar de novo:

Entrada
Programa Sada Arquivo

E/S em Java

39

Usando DataOutputStream

Os arquivos gerados so binrios e podem armazenar qualquer um dos tipos bsicos (int, char, double, etc.) e o tipo String Os arquivos criados podem ser lidos por outros programas Java mas no sero compreensveis se impressos. Temos que importar a biblioteca de E/S do Java: import java.io.*; Esta classe lana excees do tipo IOException quando problemas ocorrem
E/S em Java

40

Tratando a IOException

IOException no pode ser ignorada, seno seu programa cai trate-a com um bloco catch ou faa com que outro a trate usando a clusula throws Quando abrir um arquivo, coloque a operao dentro de um bloco try e escreva um bloco catch para esta exceo

catch(IOException e){ System.out.println("Problemas..."; }


E/S em Java

41

Abrindo um novo arquivo de sada

O nome do arquivo dado como uma String as regras de nome variam de acordo com cada sistema operacional.

Abrir um arquivo para sada requer dois passos: Crie um objeto FileOutputStream associado com a String contendo o nome do arquivo 2. Conecte a stream FileOutputStream com o objeto da classe DataOutputStream Isto pode ser feito em uma nica linha de cdigo!
E/S em Java

42

Exemplo: Abrindo um arquivo de sada


Para abrir um arquivo chamado numbers.dat:
DataOutputStream outputStream = new DataOutputStream(new FileOutputStream("numbers.dat"));

O construtor de DataOutputStream requer um argumento da classe FileOutputStream O construtor de FileOutputStream requer um argumento da classe String (nome do arquivo de sada)

E/S em Java

43

Exemplo: Abrindo um arquivo de sada

Podemos fazer a mesma coisa usando duas instrues ao invs de uma: FileOutputStream middleman =new FileOutputStream("numbers.dat"); DataOutputStream outputStream =new DataOutputSteam(middleman);

E/S em Java

44

Lembrem-se: Todo arquivo tem dois nomes!

O cdigo usado para abrir o arquivo gera dois nomes para o arquivo de sada o nome usado pelo sistema operacional numbers.dat no exemplo o nome da stream outputStream no exemplo

Todos os programas Java usam o nome da stream


No fiquem confusos. O conceito igual ao de file handlers do C e do Pascal. Ns s usvamos o nome real do arquivo ao fazer o assign/fopen. a mesma coisa!
E/S em Java

45

Alguns mtodos de DataOutputStream

Podemos escrever dados para um arquivo de sada assim que ele estiver conectado a uma stream Use os mtodo definidos em DataOutputStream
writeInt(int n) writeDouble(double x) writeBoolean(boolean b) etc Consulte http://java.sun.com para saber mais

Note que cada mtodo de escrita pode lanar uma IOException Note que cada mtodo de write definido como final

E/S em Java

46

Fechando um arquivo

Como j discutimos antes, os arquivos abertos devem ser fechados quando terminarmos de us-los.

Para fechar o arquivo use o mtodo close da classe DataOutputStream


Por exemplo, para fechar o arquivo que abrimos no cdigo acima, usamos: outputStream.close(); Se o programa fechar normalmente, ele fechar todos os arquivos que ainda estiverem abertos (parte do servio de garbage colletion).
E/S em Java

47

import java.io.*; import javax.swing.JOptionPane; public class FileIO4 { public static void main(String[] args) { try { DataOutputStream outputStream = new DataOutputStream( new FileOutputStream("numbers.dat")); int n; String line=null; do { line = JOptionPane.showInputDialog("Entre com um num>=0 (negativo termina): "); n = Integer.parseInt(line); outputStream.writeInt(n); }while (n >= 0); outputStream.close(); } catch(IOException e) { System.out.println("Problemas na sada de dados."); } System.exit(0); } }
E/S em Java

Exemplo de escrita

48

Sada (arquivo numbers.dat)


Entrada dada : 1, 2, 3, 4, -1. Note que no h texto legvel no arquivo, mas sim as representaes binrias de cada um dos nmeros

-1

O que o editor de texto entende por -1

E/S em Java

49

Lembrando...
As razes para fecharmos os arquivos permanecem as mesmas: 1. Para garantir que o arquivo est fechado se o programa terminar de forma anormal. 2. Um arquivo aberto para escrita tem que ser fechado antes de poder ser aberto para leitura

E/S em Java

50

Modo binrio muito parecido com modo texto


Eu disse que seria repetitivo, mas no temos que correr, pois no temos pressa...

E/S em Java

51

Escrevendo um caracter em um arquivo

O mtodo writeChar recebe um argumento do tipo int, e no char Para resolver, faa um typecast do char para int. Por exemplo: outputStream.writeChar((int) 'A');

E/S em Java

52

Escrevendo um valor boolean em um arquivo

Variveis boolean podem valores: true ou false

assumir

dois

true e false no so apenas nomes dos valores, mas so do tipo boolean


No como se fizssemos um #define em C

Por exemplo, para escrever o valor false to para o arquivo faa: outputStream.writeBoolean(false);
E/S em Java

53

Escrevendo Strings em um Arquivo


No h um mtodo writeString : use o mtodo writeUTF UTF : Unicode Text Format verso especial do Unicode
cdigo internacional que usa 2 bytes por caracter desginado para acomodar as lnguas faladas pela maioria da humanidade. Comparao: ASCII s usa 1 byte por caracter, logo s acomoda lnguas com alfabeto latino (e uma de cada vez) O UTF uma modificao do Unicode que usa 1 byte apenas. Permite outras linguagens sem sacrificar a eficincia do ASCII

E/S em Java

54

Ateno : Sobreescrevendo um arquivo

Abrir um arquivo para escrita que no existe cria um arquivo novo (em branco) Abrir para escrita um arquivo que j existe elimina o antigo arquivo e cria um arquivo novo em branco. Veremos mais adiante como testar se uma rquivo existe para evitar sobreescrev-lo.

E/S em Java

55

Usando DataInputStream para ler dados

Os arquivos lidos so similares aos criados pelo DataOutputStream


Os arquivos gerados so binrios e podem armazenar qualquer um dos tipos bsicos (int, char, double, etc.) e o tipo String Os arquivos criados podem ser lidos por outros programas Java mas no sero compreensveis se impressos.

Tambm nesse caso, temos que importar a biblioteca de E/S do Java: import java.io.*; Esta classe tambm lana excees IOException quando problemas ocorrem
E/S em Java

do

tipo
56

Abrindo um arquivo

Similar a abrir um arquivo de sada, mas substitua a palavra "output" pela palavra "input"

A complexidade exatamente a mesma!

E/S em Java

57

Exemplo: Abrindo um arquivo de entrada


Para abrir um arquivo chamado numbers.dat:
DataInputStream inStream = new DataInputStream(new FileInputStream("numbers.dat"));

O construtor de DataInputStream requer um argumento da classe FileInputStream O construtor de FileIntputStream requer um argumento da classe String (nome do arquivo de sada)

E/S em Java

58

Exemplo: Abrindo um arquivo de sada

Da mesma maneira que no caso dos arquivos de sada, podemos fazer a mesma coisa usando duas instrues ao invs de uma:

FileInputStream middleman =new FileInputStream("numbers.dat"); DataInputStream inStream =new DataInputSteam(middleman);

E/S em Java

59

Alguns mtodos de DataInputStream

Para cada mtodo de sada, ns temos um mtodo de entrada correspondente.

Podemos ler dados de um arquivo de entrada conectado a uma stream usando os seguinte mtodos de DataInputStream
readInt() readDouble() readBoolean() etc.

Assim como no caso da escrita:


Cada mtodo de leitura pode lanar uma IOException Cada mtodo de read definido como final
E/S em Java

60

import java.io.*; public class FileIO5 { public static void main(String[] args) { try { DataInputStream inputStream = new DataInputStream(new FileInputStream("numbers.dat")); int n; System.out.println("Lendo o arquivo numbers.dat"); n = inputStream.readInt(); while (n >= 0) { System.out.println(n); n = inputStream.readInt(); } System.out.println("Fim da leitura."); inputStream.close(); } catch(IOException e) { System.out.println("Problemas ao ler o arquivo numbers.dat."); } } }
E/S em Java

Exemplo de leitura

61

Sada de nosso exemplo

Porque no imprimiu o -1?


E/S em Java

62

Excees de streams de entrada

Uma exceo FileNotFoundException lanada se o arquivo no for encontrado quando tentamos abrir o arquivo. Cada mtodo de leitura pode lanar uma IOException e ns temos que escrever um bloco de catch para ela. Se uma leitura feita depois do fim do arquivo ento uma exceo da classe EOFException lanada.

E/S em Java

63

Evitando erros comuns com DataInputStream

Nenhuma mensagem de erro ou exceo ocorre se voc ler o tipo errado de dados. Isto , se o dado um integer e voc l um boolean, o Java no pressupe que exite um erro. Para as streams, os arquivos so uma grande seqncia de bits - voc quem tem que saber interpretar.

E/S em Java

64

Feche seus DataInputStream

Sejam bons meninos e no esqueam de fechar seus arquivos...

Arquivos abertos podem ser danificados se o programa terminar com uma exceo!

E/S em Java

65

import javax.swing.JOptionPane;import java.io.*; public class FileIO6 { public static void main(String[] args) { String fileName = null; try { fileName = JOptionPane.showInputDialog(Nome do arquivo: "); DataInputStream inputStream = new DataInputStream(new FileInputStream(fileName)); int n; System.out.println("Lendo o arquivo"+fileName); n = inputStream.readInt(); while (n >= 0) { System.out.println(n); n = inputStream.readInt(); } System.out.println("Fim da leitura."); inputStream.close(); } catch(IOException e) { System.out.println("Problemas lendo " + fileName); } System.exit(0); } } E/S em Java

Leitura usando nome lido do teclado

66

Resultado de nosso exemplo

E/S em Java

67

Lidando com excees de E/S


Capturando IOExceptions IOException uma classe pr-definida

Todas as operaes de E/S que descrevemos podem lanar uma IOException

Voc deve ao menos capturar a exceo em um bloco catch que ao menos imprima uma mensagem de erro e termine o programa.
normal que um programa no possa continuar se no puder ler seu arquivo de entrada ou gerar seu arquivo de sada.

E/S em Java

68

Lidando com excees de E/S

FileNotFoundException derivada da classe IOException Assim, qualquer bloco de catch que capture IOExceptions tambm vai capturar excees da classe FileNotFoundException Erros podem ser isolados melhor se houver mensagens de erros distintas, logo crie blocos diferentes para as duas classes. Coloque a mais especfica (a derivada) primeiro, de forma que s pegue as excees de file not found Assim, saberemos que erros de E/S no so problemas de arquivos no encontrados.
E/S em Java

69

Lembrando OO

Um filho da classe do pai, mas um pai no da classe do filho! Logo, FileNotFoundException tambm da classe IOException, mas a recproca no verdadeira.

Como o fluxo de execuo termina depois de capturada a exceo pelo primeiro bloco catch que conseguir, se o bloco que trata IOException vier antes, o bloco que trata FileNotFoundException nunca ser alcanado.

E/S em Java

70

import java.io.*; Exemplo de como lidar public class FileIO7 { com excees na leitura public static void main(String[] args) { try { DataInputStream inputStream = new DataInputStream( new FileInputStream("numbers.dat")); int n; System.out.println("Lendo o arquivo numbers.dat"); n = inputStream.readInt(); while (n >= 0) { System.out.println(n); n = inputStream.readInt(); } System.out.println("Fim da leitura."); inputStream.close(); } catch(FileNotFoundException e) { System.out.println("No achei numbers.dat."); } catch(IOException e) { System.out.println("Problemas lendo numbers.dat.");} } }
E/S em Java

71

Resultado da execuo de nosso exemplo

E/S em Java

72

Como lidar com fim de arquivo de leitura

Normalmente, quando lemos dados de um arquivo de entrada, ns no sabemos quantos dados existem. Nestas situaes, ns precisamos checar se o arquivo efetivamente acabou.

H trs maneiras de fazer isto:


Coloque um valor de sentinela ao fim do arquivo e teste se o encontrou. Capture uma exceo de fim de arquivo. Teste para a existncia de um caracter especial que sinaliza o fim de arquivo (Ctrl-Z no Pascal antigo)

E/S em Java

73

A classe EOFException

Muitos (mas no todos) dos mtodos que lem de um arquivo lanam um exceo da classe EOFException quando tentam ler alm do fim do arquivo.
Todos os mtodos que discutimos at agora o fazem.

A excep de fim de arquivo pode ser usada dentro de um loop infinito (por exemplo, while(true)) que l e processa dados de um arquivo
O loop termina quando a exceo EOFException lanada.

O programa continua normalmente captura de EOFException.


E/S em Java

depois

da
74

import java.io.*; Exemplo de como usar EOFException public class FileIO8 { public static void main(String[] args) { try { DataInputStream inputStream = new DataInputStream(new FileInputStream("numbers.dat")); int n; System.out.println("Lendo os nmeros em numbers.dat."); try { while (true) { n = inputStream.readInt(); System.out.println(n); } } catch(EOFException e) { System.out.println("Fim do arquivo.");} inputStream.close(); } catch(FileNotFoundException e) { System.out.println("No achei o arquivo numbers.dat.");} catch(IOException e) { System.out.println("Problemas com arquivo numbers.dat."); } } } E/S em Java 75

Resultado de nosso exemplo

E/S em Java

76

A classe File

uma classe para nomes de arquivos Um nome de arquivo (como por exemplo "numbers.dat) s tem as propriedades da classe String Um nome de arquivo da classe File tambm tem vrios mtodos teis exists: testa para determinar se o arquivo j existe canRead: testa para determinar se o SO permitir que voc leia o arquivo

E/S em Java

77

A classe File

FileInputStream e FileOutputStream tm construtores que recebem argumentos da classe File da mesma maneira que tm construtores que recebem argumentos da classe String. Sempre que puder, use a classe File e teste seus arquivos antes de us-los.
Evita sobreescrever arquivos teis Evita erros de no poder efetuar uma leitura

E/S em Java

78

Usando a import java.io.*;import javax.swing.JOptionPane; public class FileIO9 { classe FILE public static void main(String[] args) { String name = null; File fileObject = null; name = JOptionPane.showInputDialog("Entre o nome : "); fileObject = new File(name); while (( !fileObject.exists()) || ( !fileObject.canRead())) { if (!fileObject.exists()) System.out.println(No existe"); else if ( !fileObject.canRead()) System.out.println(No posso ler."); name = JOptionPane.showInputDialog("Entre nome de novo: "); fileObject = new File(name); } try { DataInputStream fileInput = new DataInputStream(new FileInputStream(name)); String firstString = fileInput.readUTF(); System.out.println(A primeira string :+firstString); fileInput.close(); } catch(IOException e) {System.out.println(Erro de E/S");} } } E/S em Java

79

Usando o caminho do arquivo


Caminho (Path) d o nome do aqruivo e sua localizao no disco (diretrio) Caminho relativo d o caminho para o arquivo comeando no diretrio onde est o programa Caminho tpico do UNIX : /user/smith/home.work/java/FileClassDemo.java

Caminho tpico do Windows: D:\Work\Java\Programs\FileClassDemo.java

Quando usarmos a barra invertida em uma string, ela deve ser colocada duas vezes, pois a barra invertida a sinalizadora de caracteres especiais: "D:\\Work\\Java\\Programs\\FileClassDemo.java"

Java aceita caminhos nos formatos UNIX ou Windows sem verificar em que sistemas estamos.
Os erros ficam por conta do usurio tratar.
E/S em Java

80

Alguns mtodos na classe File

public boolean exists() - Testa se existe o arquivo com o nome usado como parmetro para o construtor (se no for dado o path, ser usado o diretrio corrente)

public boolean canRead()


- Testa se podemos ler do arquivo.

public boolean canWrite()


- Testa se podemos escrever no arquivo.

E/S em Java

81

Alguns mtodos na classe File

public boolean delete() - Tenta apagar o arquivo e retorna true se foi bem sucedido (e false caso no tenha sido). public long length() - Retorna o tamanho do arquivo em bytes.

public String getName() - Retorna o nome do arquivo.

public String getPath() - Retorna path do arquivo.


E/S em Java

82

Fim!

Existem mais mtodos, mas o essencial do uso de arquivos foi coberto nesta aula. Faam as listas!

E/S em Java

83

Você também pode gostar