Escolar Documentos
Profissional Documentos
Cultura Documentos
E/S em Java
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
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 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
Para ns incompreensvel, mas o programa certo (no caso Winzip ou similar) decodifica-o sem problemas.
E/S em Java
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
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
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
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
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
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
13
Fechando um arquivo
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
E/S em Java
19
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
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
E/S em Java
25
BufferedReader(Reader readerObject) o nico construtor que precisaremos no h nenhum construtor que aceite um nome de arquivo como argumento
26
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.
27
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
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
int count = 0; String line = inputStream.readLine(); while (line != null) { count++; outputStream.println(count + " " + line); line = inputStream.readLine(); }
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
E/S em Java
34
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
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
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
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
41
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
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
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
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
45
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.
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
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
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
E/S em Java
51
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
assumir
dois
Por exemplo, para escrever o valor false to para o arquivo faa: outputStream.writeBoolean(false);
E/S em Java
53
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
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
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"
E/S em Java
57
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
Da mesma maneira que no caso dos arquivos de sada, podemos fazer a mesma coisa usando duas instrues ao invs de uma:
E/S em Java
59
Podemos ler dados de um arquivo de entrada conectado a uma stream usando os seguinte mtodos de DataInputStream
readInt() readDouble() readBoolean() etc.
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
62
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
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
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
66
E/S em Java
67
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
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
E/S em Java
72
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.
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.
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
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
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
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)
E/S em Java
81
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.
82
Fim!
Existem mais mtodos, mas o essencial do uso de arquivos foi coberto nesta aula. Faam as listas!
E/S em Java
83