Académique Documents
Professionnel Documents
Culture Documents
CAPTULO 15
Pacote java.io
"A benevolncia sobretudo um vcio do orgulho e no uma virtude da alma." Doantien Alphonse Franois (Marqus de Sade) Ao trmino desse captulo, voc ser capaz de: ler e escrever bytes, caracteres e Strings de/para a entrada e sada padro; ler e escrever bytes, caracteres e Strings de/para arquivos; utilizar buffers para agilizar a leitura e escrita atravs de fluxos; usar Scanner e PrintStream.
Nova editora Casa do Cdigo com livros de uma forma diferente Editoras tradicionais pouco ligam para ebooks e novas tecnologias. No conhecem programao para revisar os livros tecnicamente a fundo. No tm anos de experincia em didticas com cursos. Conhea a Casa do Cdigo, uma editora diferente, com curadoria da Caelum e obsesso por livros de qualidade a preos justos. Casa do Cdigo, ebook com preo de ebook.
essa classe obriga voc a passar o nome do arquivo pelo construtor: sem isso o objeto no pode ser construdo.
1 c l a s sT e s t a E n t r a d a{ 2 3 4 5 6 }
A classe I n p u t S t r e a m abstrata e F i l e I n p u t S t r e a muma de suas filhas concretas. F i l e I n p u t S t r e a mvai procurar o arquivo no diretrio em que a JVM fora invocada (no caso do Eclipse, vai ser a partir de dentro do diretrio do projeto). Alternativamente voc pode usar um caminho absoluto. Quando trabalhamos com j a v a . i o , diversos mtodos lanam I O E x c e p t i o n , que uma exception do tipo checked - o que nos obriga a trat-la ou declar-la. Nos exemplos aqui, estamos declarando I O E x c e p t i o natravs da clausula t h r o w sdo m a i napenas para facilitar o exemplo. Caso a exception ocorra, a JVM vai parar, mostrando a stacktrace. Esta no uma boa prtica em uma aplicao real: trate suas exceptions para sua aplicao poder abortar elegantemente. I n p u t S t r e a mtem diversas outras filhas, como O b j e c t I n p u t S t r e a m , A u d i o I n p u t S t r e a m ,B y t e A r r a y I n p u t S t r e a m , entre outras. Para recuperar um caractere, precisamos traduzir os bytes com o encoding dado para o respectivo cdigo unicode, isso pode usar um ou mais bytes. Escrever esse decodificador muito complicado, quem faz isso por voc a classe I n p u t S t r e a m R e a d e r .
1 c l a s sT e s t a E n t r a d a{ 2 3 4 5 6 7 }
O construtor de I n p u t S t r e a m R e a d e rpode receber o encoding a ser utilizado como parmetro, se desejado, tal como U T F 8ou I S O 8 8 5 9 1 .
Encodings Devido a grande quantidade de aplicativos internacionalizados de hoje em dia, imprescindvel que um bom programador entenda bem o que so os
character encodings e o Unicode. O blog da Caelum possui um bom artigo a respeito: http://blog.caelum.com.br/2006/10/22/entendendo-unicode-e-oscharacter-encodings/
I n p u t S t r e a m R e a d e r filha da classe abstrata R e a d e r , que possui diversas outras filhas - so classes que manipulam chars. Apesar da classe abstrata R e a d e rj ajudar no trabalho de manipulao de caracteres, ainda seria difcil pegar uma S t r i n g . A classe B u f f e r e d R e a d e r um R e a d e rque recebe outro R e a d e rpelo construtor e concatena os diversos chars para formar uma S t r i n gatravs do mtodo r e a d L i n e :
1 c l a s sT e s t a E n t r a d a{ 2 3 4 5 6 7 8 }
Como o prprio nome diz, essa classe l do R e a d e rpor pedaos (usando o buffer) para evitar realizar muitas chamadas ao sistema operacional. Voc pode at configurar o tamanho do buffer pelo construtor. essa a composio de classes que est acontecendo:
Esse padro de composio bastante utilizado e conhecido. o Decorator Pattern . Aqui, lemos apenas a primeira linha do arquivo. O mtodo r e a d L i n edevolve a linha que foi lida e muda o cursor para a prxima linha. Caso ele chegue ao fim do R e a d e r(no nosso caso, fim do arquivo), ele vai devolver n u l l . Ento, com um simples lao, podemos ler o arquivo por inteiro:
1 c l a s sT e s t a E n t r a d a{
2 3 4 5 6 7 8 9
1 0 1 1 1 2 1 3 1 4 b r . c l o s e ( ) ; 1 5 } 1 6 }
9 1 0 1 1 1 2 } 1 3 }
Apenas modificamos a quem a varivel i sest se referindo. Podemos receber argumentos do tipo I n p u t S t r e a me ter esse tipo de abstrao: no importa exatamente de onde estamos lendo esse punhado de bytes, desde que a gente receba a informao que estamos querendo. Como na figura:
Repare que a ponta da direita poderia ser qualquer I n p u t S t r e a m , seja O b j e c t I n p u t S t r e a m ,A u d i o I n p u t S t r e a m ,B y t e A r r a y I n p u t S t r e a m , ou a nossa F i l e I n p u t S t r e a m . Polimorfismo! Ou voc mesmo pode criar uma filha de I n p u t S t r e a m , se desejar. Por isso muito comum mtodos receberem e retornarem I n p u t S t r e a m , em vez de suas filhas especficas. Com isso, elas desacoplam as informaes e escondem a implementao, facilitando a mudana e manuteno do cdigo. Repare que isso vai ao encontro de tudo o que aprendemos durante os captulos que apresentaram classes abstratas, interfaces, polimorfismo e encapsulamento.
O u t p u t S t r e a m W r i t e ro s w=n e wO u t p u t S t r e a m W r i t e r ( o s ) ; B u f f e r e d W r i t e rb w=n e wB u f f e r e d W r i t e r ( o s w ) ;
6 7 b w . w r i t e ( " c a e l u m " ) ; 8 9 b w . c l o s e ( ) ; 1 0 } 1 1 }
Lembre-se de dar refresh (clique da direita no nome do projeto, refresh) no seu projeto do Eclipse para que o arquivo criado aparea. O F i l e O u t p u t S t r e a mpode
receber um booleano como segundo parmetro, para indicar se voc quer reescrever o arquivo ou manter o que j estava escrito (a p p e n d ). O mtodo w r i t edo B u f f e r e d W r i t e rno insere o(s) caractere(s) de quebra de linha. Para isso, voc pode chamar o mtodo n e w L i n e .
Fechando o arquivo com o finally e o try-with-resources importante sempre fechar o arquivo. Voc pode fazer isso chamando diretamente o mtodo c l o s edo F i l e I n p u t S t r e a m /O u t p u t S t r e a m , ou ainda chamando o c l o s edo B u f f e r e d R e a d e r /W r i t e r . Nesse ltimo caso, o c l o s e ser cascateado para os objetos os quais o B u f f e r e d R e a d e r /W r i t e rutiliza para realizar a leitura/escrita, alm dele fazer o flush dos buffers no caso da escrita. comum e fundamental que o c l o s eesteja dentro de um bloco f i n a l l y . Se um arquivo for esquecido aberto e a referncia para ele for perdida, pode ser que ele seja fechado pelo garbage collector, que veremos mais a frente, por causa do f i n a l i z e . Mas no bom voc se prender a isso. Se voc esquecer de fechar o arquivo, no caso de um programa minsculo como esse, o programa vai terminar antes que o tal do garbage collector te ajude, resultando em um arquivo no escrito (os bytes ficaram no buffer do B u f f e r e d W r i t e r ). Problemas similares podem acontecer com leitores que no forem fechados. No Java 7 h a estrutura try-with-resources, que j far o f i n a l l ycuidar dos recursos declarados dentro do t r y ( ) , invocando c l o s e . Pra isso, os recursos devem implementar a interface j a v a . l a n g . A u t o C l o s e a b l e , que o caso dos Readers, Writers e Streams estudados aqui:
t r y( B u f f e r e d R e a d e rb r=n e wB u f f e r e d R e a d e r ( n e wF i l e ( " a r q u i v o . t x t " ) ) ){ / /c o me x c e oo un o ,oc l o s e ( )d ob rs e r ai n v o c a d o }
J conhece os cursos online Alura? A Alura oferece dezenas de cursos online em sua plataforma exclusiva de ensino que favorece o aprendizado com a qualidade reconhecida da Caelum. Voc pode escolher um curso nas reas de Java, Ruby, Web, Mobile, .NET e outros, ou fazer a assinatura semestral que d acesso a todos os cursos.
Nenhum dos mtodos lana I O E x c e p t i o n :P r i n t S t r e a mlana F i l e N o t F o u n d E x c e p t i o nse voc o construir passando uma S t r i n g . Essa exceo filha de I O E x c e p t i o ne indica que o arquivo no foi encontrado. O S c a n n e r considerar que chegou ao fim se uma I O E x c e p t i o nfor lanada, mas o P r i n t S t r e a msimplesmente engole exceptions desse tipo. Ambos possuem mtodos para voc verificar se algum problema ocorreu. A classe S c a n n e r do pacote j a v a . u t i l . Ela possui mtodos muito teis para trabalhar com Strings, em especial, diversos mtodos j preparados para pegar nmeros e palavras j formatadas atravs de expresses regulares. Fica fcil parsear um arquivo com qualquer formato dado.
System.out Como vimos no captulo passado, o atributo o u tda classe S y s t e m do tipo P r i n t S t r e a m(e, portanto, um O u t p u t S t r e a m ).
Pesquise-o e utilize-o no cdigo para ler um arquivo, ele vai ficar mais sucinto (voc no precisar ler a primeira linha fora do lao).
S t r i n gl i n h a=b r . r e a d L i n e ( ) ;/ /p r i m e i r al i n h a w h i l e( l i n h a! =n u l l ){ S y s t e m . o u t . p r i n t l n ( l i n h a ) ; l i n h a=b r . r e a d L i n e ( ) ; }
O compilador vai reclamar que voc no est tratando algumas excees (como j a v a . i o . I O E x c e p t i o n ). Utilize a clusula t h r o w spara deixar "escapar" a exceo pelo seu m a i n , ou use os devidos t r y /c a t c h . Utilize o quick fix do Eclipse para isso (Ctrl + 1). Deixar todas as exceptions passarem desapercebidas no uma boa prtica! Voc pode usar aqui, pois estamos focando apenas no aprendizado da utilizao do j a v a . i o . Rode sua aplicao. Atravs da View Console voc pode digitar algumas linhas para que seu programa as capture.
EOF Quando rodar sua aplicao, para encerrar a entrada de dados do teclado, necessrio enviarmos um sinal de fim de stream. o famoso EOF, End Of File. No Linux/Mac/Solaris/Unix voc faz isso com o C O N T R O L + D . No Windows, use o C O N T R O L + Z .
2. Vamos ler de um arquivo, em vez do teclado. Antes, vamos criar o arquivo que ser lido pelo programa: a. Clique com o boto direito em cima do seu projeto e selecione New -> File:
3. (conceitual) Seu programa l todas as linhas desse arquivo. Repare na utilizao do polimorfismo. Como ambos so I n p u t S t r e a m , isso faz com que eles se encaixem no I n p u t S t r e a m R e a d e r . 4. Repare que, no final, s usamos mesmo o B u f f e r e d R e a d e r . As referncias para I n p u t S t r e a me para I n p u t S t r e a m R e a d e rso apenas utilizadas temporariamente. Portanto, comum encontrarmos o seguinte cdigo nesses casos:
B u f f e r e d R e a d e rb r=n e wB u f f e r e d R e a d e r ( n e wI n p u t S t r e a m R e a d e r ( n e wF i l e I n p u t S t r e a m ( " a r q u i v o . t x t " ) ) ) ; S t r i n gl i n h a=b r . r e a d L i n e ( ) ;/ /p r i m e i r al i n h a
Claro que devemos evitar um cdigo mais sucinto em vez de sacrificar legibilidade,
mas este cdigo em particular bem comum e aceitvel. Faa a alterao no seu programa! 5. Utilize a classe S c a n n e rdo Java 5 para ler de um arquivo e colocar na tela. O cdigo vai ficar incrivelmente pequeno.
1 c l a s sE n t r a d a D e U m A r q u i v o{ 2 p u b l i cs t a t i cv o i dm a i n ( S t r i n g [ ]a r g s )t h r o w sI O E x c e p t i o n{ 3 4 5 6
7 8 9 1 0 i s . c l o s e ( ) ; 1 1 } 1 2 }
Depois troque a varivel i spara que ela se refira ao S y s t e m . i n . Agora voc est lendo do teclado! 6. (opcional) Altere seu programa para que ele leia do arquivo e, em vez de jogar na tela, jogue em um outro arquivo. Voc vai precisar, alm do cdigo anterior para ler de um arquivo, do cdigo para escrever em um arquivo. Para isso, voc pode usar o B u f f e r e d W r i t e rou o P r i n t S t r e a m , sendo este ltimo de mais fcil manipulao. Se for usar o B u f f e r e d W r i t e r , fazemos assim parar abri-lo:
O u t p u t S t r e a mo s=n e wF i l e O u t p u t S t r e a m ( " s a i d a . t x t " ) ; O u t p u t S t r e a m W r i t e ro s w=n e wO u t p u t S t r e a m W r i t e r ( o s ) ; B u f f e r e d W r i t e rb w=n e wB u f f e r e d W r i t e r ( o s w ) ;
Dentro do loop de leitura do teclado, voc deve usar b w . w r i t e ( x ) , onde x a linha que voc leu. Use b w . n e w L i n e ( )para pular de linha. No se esquea de, no trmino do loop, dar um b w . c l o s e ( ) . Voc pode seguir o modelo:
w h i l e( e n t r a d a . h a s N e x t L i n e ( ) ){ S t r i n gl i n h a=e n t r a d a . n e x t L i n e ( ) ; b w . w r i t e ( l i n h a ) ; b w . n e w L i n e ( ) ; } b w . c l o s e ( ) ;
Aps rodar seu programa, d um refresh no seu projeto (clique da direita no nome do projeto, refresh) e veja que ele criou um arquivo s a i d a . t x tno diretrio. 7. (opcional) Altere novamente o programa para ele virar um pequeno editor: l do
teclado e escreve em arquivo. Repare que a mudana a ser feita mnima! 8. (opcional) A classe S c a n n e r muito poderosa! Consulte seu javadoc para saber sobre o d e l i m i t e re os outros mtodos n e x t .
Voc no est nessa pgina a toa Voc chegou aqui porque a Caelum referncia nacional em cursos de Java, Ruby, Agile, Mobile, Web e .NET. Faa curso com quem escreveu essa apostila. Consulte as vantagens do curso Java e Orientao a Objetos.
objetos. Outros padres surgiram depois, em outras literaturas igualmente consagradas. O conhecimento dessas tcnicas imprescindvel para o bom programador. Discuta com o instrutor como Design Patterns ajudam a resolver problemas de modelagem em sistemas orientados a objetos. Veja como Design Patterns so aplicados em muitos lugares do prprio Java. O instrutor comentar do T e m p l a t eM e t h o de mostrar o cdigo fonte do mtodo read() da classe j a v a . i o . I n p u t S t r e a m :
1 p u b l i ci n tr e a d ( b y t eb [ ] ,i n to f f ,i n tl e n )t h r o w sI O E x c e p t i o n{ 2 i f( b= =n u l l ){ 3 t h r o wn e wN u l l P o i n t e r E x c e p t i o n ( ) ; 4 }e l s ei f( o f f<0| |l e n<0| |l e n>b . l e n g t h-o f f ){ 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9
Discuta em aula como esse mtodo aplica conceitos importantes da orientao a objetos e promove flexibilidade e extensibilidade.
CAPTULO ANTERIOR:
O pacote java.lang
PRXIMO CAPTULO:
Collections framework
Blog Caelum
Cursos Online
Newsletter
Casa do Cdigo