Escolar Documentos
Profissional Documentos
Cultura Documentos
Entrada e Sada
Helder da Rocha
www.argonavis.com.br
Assuntos abordados
Este mdulo explora os componentes mais importantes do pacote java.io e outros recursos da linguagem relacionados E/S e arquivos A classe File, que representa arquivos e diretrios Objetos que implementam entrada e sada
InputStream e OutputStream, Readers e Writers Compresso com GZIP streams FileChannels
Logging: fundamentos
O pacote java.io
Oferece abstraes que permitem ao programador lidar com arquivos, diretrios e seus dados de uma maneira independente de plataforma
File, RandomAccessFile
Oferecem recursos para facilitar a manipulao de dados durante o processo de leitura ou gravao
bytes sem tratamento caracteres Unicode dados filtrados de acordo com certo critrio dados otimizados em buffers leitura/gravao automtica de objetos
A classe File
Usada para representar o sistema de arquivos
apenas uma abstrao: a existncia de um objeto File no significa a existncia de um arquivo ou diretrio Contm mtodos para testar a existncia de arquivos, para definir permisses (nos S.O.s onde for aplicvel), para apagar arquivos, criar diretrios, listar o contedo de diretrios, etc.
Alguns mtodos
String getAbsolutePath() String getParent(): retorna o diretrio (objeto File) pai boolean exists() boolean isFile() boolean isDirectory() boolean delete(): tenta apagar o diretrio ou arquivo long length(): retorna o tamanho do arquivo em bytes boolean mkdir(): cria um diretrio com o nome do arquivo String[] list(): retorna lista de arquivos contido no diretrio
APIs Java para I/O oferecem objetos que abstraem fontes/destinos (ns) e fluxos de bytes e caracteres
6
E/S de bytes
InputStream
Classe genrica (abstrata) para lidar com fluxos de bytes de entrada e ns de fonte (dados para leitura). Mtodo principal: read()
OutputStream
Classe genrica (abstrata) para lidar com fluxos de bytes de sada e ns de destino (dados para gravao). Mtodo principal: write()
Principais implementaes
Ns (fontes): FileInputStream (arquivo), ByteArrayInputStream (memria) e PipedInputStream (pipe). Processamento de entrada: FilterInputStream (abstract) e subclasses Ns (destinos): FileOutputStream (arquivo), ByteArrayOutputStream (memria) e PipedOutputStream (pipe). Processamento de sada: FilterOutputStream (abstract) e subclasses.
Mtodos de OutputStream
void write(int c): grava um byte (ineficiente) void write(byte[] buffer) void write(byte[] buffer, int offset, int length) void close(): fecha o stream (essencial) void flush(): esvazia o buffer
9
10
FilterStreams
Implementam o padro de projeto Decorator
So concatenados em streams primitivos oferecendo mtodos mais teis com dados filtrados
FilterInputStream: recebe fonte de bytes e oferece mtodos para ler dados filtrados. Implementaes:
DataInputStream: readInt(), readUTF(), readDouble() BufferredInputStream: read() mais eficiente ObjectOutputStream: readObject() l objetos serializados
DataOutputStream: writeUTF(), writeInt(), etc. BufferedOutputStream: write() mais eficiente ObjectOutputStream: writeObject() serializa objetos PrintStream: classe que implementa println()
11
// objeto do tipo File File tanque = new File("agua.txt"); // referncia FileInputStream // cano conectado no tanque FileInputStream cano = new FileInputStream(tanque); // l um byte a partir do cano byte octeto = cano.read();
12
13
// filtro chf conectado no cano InputStreamReader chf = new InputStreamReader(cano); // filtro br conectado no chf BufferedReader br = new BufferedReader (chf); // l linha de texto a de br String linha = br.readLine();
14
E/S de caracteres
Reader
Classe abstrata para lidar com fluxos de caracteres de entrada: mtodo read() l um caractere (16 bits) por vez
Writer
Classe abstrata para lidar com fluxos de bytes de sada: mtodo write() grava um caractere (16 bits) por vez
Principais implementaes
Ns (destinos): FileWriter (arquivo), CharArrayWriter (memria), PipedWriter (pipe) e StringWriter (memria). Processamento de sada: FilterWriter (abstract), BufferedWriter, OutputStreamWriter (conversor de bytes para chars), PrintWriter Ns (fontes): FileReader (arquivo), CharArrayReader (memria), PipedReader (pipe) e StringReader (memria). Processamento de entrada: FilterReader (abstract), BufferedReader, InputStreamReader (conversor bytes p/ chars), LineNumberReader 15
Mtodos de Writer
void write(int c): grava um char (ineficiente) void write(char[] buffer) void write(char[] buffer, int offset, int length) void close(): fecha o stream (essencial) void flush(): esvazia o buffer
16
17
18
RandomAccessFile
Classe "aliengena": no faz parte da hierarquia de fluxos de dados do java.io
Implementa interfaces DataOutput e DataInput Mistura de File com streams: no deve ser usado com outras classes (streams) do java.io
Oferece acesso aleatrio a um arquivo atravs de um ponteiro Mtodos (DataOutput e DataInput) tratam da leitura e escrita de Strings e tipos primitivos
void seek(long) readInt(), readBytes(), readUTF(), ... writeInt(), writeBytes(), writeUTF(), ...
19
RandomAccessFile
RandomAccessFile raf = new RandomAccessFile ("arquivo.dat", "rw");
0 0 0 11 0 d 0 c 0 0 j 0 a 0 v 0 a
raf.readLong() (4 bytes)
raf.seek(raf.length())
20
Exceptions
A maior parte das operaes de E/S provoca excees que correspondem ou so subclasses de IOException
EOFException FileNotFoundException StreamCorruptedException
Para executar operaes de E/S preciso, portanto, ou capturar IOException ou repassar a exceo atravs de declaraes throws nos mtodos causadores Nos exemplos mostrados o tratamento de excees foi omitido. Tipicamente, as instrues close() ocorrem em um bloco try-catch dentro de um bloco finally
try { ... } finally { try { stream.close(); } catch (IOException e) {} }
21
Serializao
Java permite a gravao direta de objetos em disco ou seu envio atravs da rede
Para isto, o objeto deve declarar implementar java.io Serializable
Um objeto Serializable poder, ento Ser gravado em qualquer stream usando o mtodo writeObject() de ObjectOutputStream Ser recuperado de qualquer stream usando o mtodo readObject() de ObjectInputStream Um objeto serializado um grafo que inclui dados da classe e todas as suas dependncias Se a classe ou suas dependncias mudar, o formato usado na serializao mudar e os novos objetos sero incompatveis com os antigos (no ser mais possvel recuperar arquivos gravados com a verso antiga)
22
Gravao de objetos
23
ZIP e JAR
Os pacotes java.util.zip e java.util.jar permitem comprimir dados e colecionar arquivos mantendo intactas as estruturas de diretrios Vantagens
Menor tamanho: maior eficincia de E/S e menor espao em disco Menos arquivos para transferir pela rede (tambm maior eficincia de E/S)
Use streams GZIP para arquivos individuais e para reduzir tamanho de dados enviados pela rede
24
25
FileChannel
Novidade no J2SDK 1.4 Permite ler e gravar arquivos, mapeando memria e bloqueando acesso (afeta performance)
Mapeamento permite abrir o arquivo como se fosse um vetor, usando a classe java.nio.ByteBuffer. Ideal para ler arquivos consistindo de registros de tamanho fixo. preciso importar java.nio.* e java.nio.channels.*;
26
Logging
Recurso introduzido no J2SDK 1.4 Oferece um servio que gera relatrios durante a execuo de uma aplicao. Os relatrios so formados por eventos escolhidos pelo programador e podem ter como destino: A tela (console), um arquivo, uma conexo de rede, etc. Os dados tambm podem ser formatados de diversas formas
Texto, XML e filtros
As mensagens so classificadas de acordo com a severidade, em sete nveis diferentes. O usurio da aplicao pode configur-la para exibir mais ou menos mensagens de acordo com o nvel desejado Principais classes java.util.logging.Logger e java.util.logging.Level
27
Logger
Para criar um Logger, preciso usar seu construtor esttico:
Logger logger = Logger.getLogger("com.meupacote");
Os principais mtodos de Logger encapsulam os diferentes nveis de detalhamento (severidade) ou tipos de informao. Mtodos log() so genricos e aceitam qualquer nvel
config(String msg) entering(String class, String method) exiting(String class, String method) fine(String msg) finer(String msg) finest(String msg) info(String msg) log(Level level, String msg) severe(String msg) throwing(String class, String method, Throwable e) warning(String msg)
28
Exemplo de Logging
Exemplo da documentao da Sun [J2SDK14]
package com.wombat; public class Nose{ // Obtain a suitable logger. private static Logger logger = Logger.getLogger("com.wombat.nose"); public static void main(String argv[]){ // Log a FINE tracing message logger.fine("doing stuff"); try{ Wombat.sneeze(); } catch (Error ex){ // Log the error logger.log(Level.WARNING,"trouble sneezing",ex); } logger.fine("done"); } }
29
Nveis de severidade
As seguintes constantes da classe Level devem ser usadas para indicar o nvel das mensagens gravadas
Level.OFF (no imprime nada no log) Level.SEVERE (maior valor - imprime mensagens graves) Level.WARNING Level.INFO Level.CONFIG Level.FINE Level.FINER Level.FINEST (menor valor - imprime detalhamento) Level.ALL (imprime tudo no log)
30
Exerccios
1. Escreva um programa que leia um arquivo de texto para dentro de uma janela de aplicao grfica (TextArea) 2. Faa um programa que leia um arquivo XML ou HTML e arranque todos os tags. Imprima na sada padro. 3. Aplicao da Biblioteca: Crie uma classe RepositorioDadosArquivo que implemente RepositorioDados mantenha arquivos armazenados em dois diretorios:
agentes/ publicacoes/
Cada diretrio dever armazenar um arquivo por registro. O nome do arquivo deve ser o codigo do registro e os dados devem estar guardados um em cada linha.
Pode-se usar BufferedReader.readLine() para l-los.
31
argonavis.com.br
32