Você está na página 1de 6

Universidade do Vale do Rio dos Sinos Laboratrio 2 Prof.

Gerson Cavalheiro Material de Apoio Aula 3


Manipulao de Streams Em Java, assim como em C e C++, a entrada/saida (input/output) realizada atravs de streams. Streams consistem em uma abstrao criada para representar locais reais (teclado, disco, monitor, rede de comunicao, etc) de onde dados devem ser lidos ou escritos. Streams representam, portanto a onte de um lu!o de dados em entrada ou em sa"da, observe #ue estes lu!os so unidirecionais$ um stream de entrada pode ser lido e um stream de sa"da pode ser escrito. % interesse maior desta abstrao prover o mesmo con&unto de servios para manipular di erentes tipos de dispositivos e ar#uivos. ' (i)ura * ilustra streams de entrada e sa"da. %bserve #ue canais de comunicao e ar#uivos em disco podem ser abertos em entrada ou em sa"da. +eclado e monitor permitem apenas uma direo.

St re

am

Stream

eam Str

P R O G R A M A

re St

am

Stream
Str e

am

Figura 1. Streams representam lu!os unidirecionais de dados, se&a em entrada ou sa"da. Curiosidade$ a palavra stream deriva de uma analo)ia a e!presso em in)l,s stream of water, si)ni icando lu!o de -)ua. .m stream de entrada parece/se com uma torneira, a #ual abrimos para permitir a entrada de -)ua e um stream de sa"da semel0ante a um ralo onde, com a&uda de uma rol0a, o lu!o de sa"da pode ser re)ulado. E!istem dois mecanismos b-sicos para manipular streams$ bu erizados e no bu erizados. Estes 1ltimos acessam diretamente os ar#uivos ou dispositivos indicados como de entrada ou sa"da de dados. 2ecanismos bu erizados empre)am uma zona de mem3ria pr3pria ao mecanismo de entrada e sa"da para armazenar temporariamente os dados manipulados. .tilizando a analo)ia com lu!o de -)ua, mecanismos bu erizados utilizam uma 4cai!a d5-)ua6 para reter uma #uantidade de -)ua pr3!ima ao consumidor (o pro)rama em e!ecuo), #uando esta cai!a estiver c0eia, o lu!o de -)ua para dentro dela interrompido at #ue ela se&a esvaziada um pouco. 7e orma semel0ante, um tan#ue de sa"da armazena -)ua at #ue este&a c0eio 8 #uando isto ocorre, todo um 4con&unto de -)ua6 despe&ado. Em Java so de inidos dois tipos de streams$ streams de caracteres e streams de b9tes. % primeiro dito modo te!to, cu&o conte1do compreens"vel na lin)ua)em 0umana. % se)undo consiste na representao da in ormao em termos de b9tes, a mesma representao utilizada pelos computadores. ' vanta)em do primeiro tipo #ue os ar#uivos podem ser manipulados diretamente por 0umanos. ' vanta)em do se)undo #ue a manipulao em pro)ramas mais e iciente, uma vez #ue no necess-rio traduzir 4te!to6 em in ormao manipul-vel pelo pro)rama. Recursos em Java % pacote java.io disponibiliza um )rande con&unto de classes para manipular streams. :ara poder utilizar este pacote necess-rio in ormar e!plicitamente sua necessidade no in"cio de seu ar#uivo .&ava com a se)uinte diretiva$
import java.io.*;

Com esta diretiva esta sendo indicado #ue todas as classes do re erido pacote podero ser utilizadas no pro)rama. ;este pacote e!istem classes para manipular tanto streams bu erizados como no bu erizados, em modo te!to e em modo b9te. 'l)umas destas classes e seus servios sero ob&etos de estudo neste material. InputStream e OutputStream Estas classes so as classes mais )enricas para entrada e sa"da de stream de b9tes. Esta classe de ine a estrutura para entrada e sa"da a #ual especializada por outras classes, con orme mostra a (i)ura <. ' (i)ura = descreve al)uns dos servios dispon"veis na classe >nputStream e a (i)ura ? servios da classe %utputStream.

Figura 2. @ierar#uia de classes para as classes InputStream e OutputStream.


int read ( )

A, um b9te e retorna o seu valor em um inteiro. Betorna 8* se c0e)ou ao im do ar#uivo. int read (byte b[ ]) Escreve os b9tes lidos na arra9 de b9tes b. Ser- lido, no m-!imo, b.length b9tes. Betorna o n1mero de b9tes lidos. int read (byte b[], int off, int Escreve length b9tes lidos na arra9 de b9tes passada como parCmetro. % primeiro b9te lido armazenado na posio length) off da arra9. Betorna o n1mero de b9tes lidos (ec0a a stream. Se e!istir uma pil0a de stream, ec0ar a void close ( ) stream do topo da pil0a, ir- ec0ar todas as outras streams. Betorna o n1mero de b9tes dispon"veis para leitura. int available ( )
long skip (long nroBytes)

boolean void markSupported ( ) void mark (int posicao) void reset( )

Este mtodo usado para movimentar o ponteiro do ar#uivo. Ele descarta nroBytes b9tes da stream. Betorna o n1mero de b9tes descartados. retorna true se os mtodos marD() and reset() so suportados pela stream marca um determinado b9te no ar#uivo volta ao ponto marcado

Figura 3. Servios para lu!os de entrada com InputStream e suas classes especializadas.
void write (int) void write (byte b [] ) void write (byte b[], int off, int length) void flush() void close ( )

Erava um b9te na stream. Erava os b9tes contidos na arra9 b na stream. Erava len)t0 b9tes da arra9 para a stream. % b9te bFo G o primeiro a ser )ravado. 'l)umas vezes a stream de sa"da pode acumular os b9tes antes de )rav-/los. % mtodo lus0 ( ) ora a )ravao dos b9tes. (ec0a a stream.

Figura 4. Servios para lu!os de sa"da com OutputStream e suas classes especializadas. % e!emplo de c3di)o da (i)ura H apresenta um trec0o de c3di)o para e!perimentar a entrada de dados a partir da console. ;este e!emplo, System.in representa o dispositivo de entrada 4teclado6.

import java.io.*; public class ConsoleInputStream { public static void main( String args[] String str ! ""; c#ar c ! $ $; {

System.out.print( "%igite alguma coisa& " ; 'or( ; ; { try { c ! (c#ar System.in.read( ; ( catc#(IO)*ception e { System.out.println ("Ocorreu erro" ; c ! +,; str ! ""; ( i'( (c !! +, -- (c!!$.n$ // 0uando c#egar no 'im ou 1)23)45 brea6; // interrompe o loop de leitura str 7! c; ( System.out.print( "8oi %igitado& " 7 str ; ( (

Figura 5. E!emplo de pro)rama para ler um strin) do teclado, caracter a caracter. E erc!cio *. 7i)ite o pro)rama acima, compile/o e observe o resultado. 7ocumente, lin0a a lin0a, o pro)rama onte. Manipulao de ar"uivos ' manipulao de ar#uivos em Java pode ser realizada com as classes 8ileInputStream e 8ileOutputStream. 'o contr-rio do teclado e do monitor, ar#uivos no se encontram abertos para leitura ou escrita. % dese&o destas operaIes deve ser indicado de orma e!plicita. 'ssim como o ar#uivo aberto, ele deve ser ec0ado ap3s seu uso. %s servios b-sicos destas classes so apresentados na (i)ura J. >n ormaIes completas em 0ttp$//&ava.sun.com/&<se/*.=/docs/api/&ava/io/(ile>nputStream.0tml e .../(ile%utputStream.0tml. 8ileInputStream Construtores
8ileOutputStream(String n 8ileInputStream(String n 'bre um ar#uivo para leitura #ue possui como nome um strin) n 8ileOutputStream(String n9 boolean a Betorna o n1mero de b9tes dispon"veis para serem serem lidos do stream. (ec0a o stream de entrada. A, um b9te de dados. A, b.len)t0 b9tes de dados e coloca no arra9 b. 7escarta n b9tes do stream 'bre um ar#uivo para escrita #ue possui como nome um strin) n. 7eleta o ar#uivo com mesmo nome se ele e!istir. 'bre um ar#uivo para escrita #ue possui como nome um strin) n, se o booleano a or true, adiciona o #ue or escrito no inal do ar#uivo &- e!istente. Caso se&a alse, deleta o ar#uivo e!istente. Erava o b9te b no stream de sa"da. Erava b.len)t0 b9tes de b no stream de sa"da.

8ileOutputStream

int available( void close( int read( int read(byte[] b long s6ip(long n

void Krite( int b )

void Krite( b9teFG b )

Figura 5. Servios de manipulao de lu!os. Ateno$ se o valor de leitura com o read or /*, si)ni ica #ue o inal do ar#uivo oi atin)ido. E erc!cios <. Escreva um pro)rama #ue opere como o comando type do 2S/7%S leia um ar#uivo cu&o nome oi passado como parCmetro e o imprima na tela. 'ntes de abrir o ar#uivo, teste com a classe (ile se o ar#uivo e!iste, e avise o usu-rio caso ele no e!ista. 7ica$ Ain0a de comando$ 7entro do pro)rama$
java meuprograma meuprograma.java public static void main( String[] args t#ro:s IO)*ception { 8ileInputStream in ! ne: 8ileInputStream(args[,] ; ; (

=. Escreva um pro)rama #ue opere como o comando copy do 2S/7%S, o #ual deve receber como parCmetro dois nomes de
ar#uivo, um de entrada e outro de sa"da. % pro)rama deve copiar o ar#uivo de entrada no novo ar#uivo de sa"da. ?. >mplemente e analise o resultado do pro)rama abai!o. Comente o pro)rama lin0a a lin0a e observe #ue este pro)rama inclui o operador tern-rio.
import java.io.*; import java.te*t.*; //%ate8ormat9 Simple%ate8ormat import java.util.%ate; class 3esta<r=uivo { public static void main (String args [] { 8ile ' ! ne: 8ile("3esta<r=uivo.java" ; System.out.println("2ome do ar=uivo& " 7 '.get2ame( ; System.out.println("Camin#o& " 7 '.get>at#( ; // retorna diretorio denotado pelo nome System.out.println("Camin#o <bsoluto& " 7 '.get<bsolute>at# ( ; // consulta SO System.out.println("%iret?@rio pai& " 7 '.get>arent ( ; System.out.println('.e*ists( A ")*iste" & "2ao e*iste" ; System.out.println('.canBrite( A ">ode ser gravado"&"2ao pode ser gravado" ; System.out.println('.can4ead( A ">ode ser lido" & "2ao pode ser lido" ; System.out.println('.is%irectory ( A ")# diretorio"&"2ao e# diretorio" ; %ate8ormat d' ! ne: Simple%ate8ormat( "dd/mm/yyyy" ; %ate data ! ne: %ate( '.lastCodi'ied( ; System.out.println("Dltima modi'icacao do ar=uivo& " 7 d'.'ormat (data ; System.out.println("3aman#o do ar=uivo& " 7 '.lengt#( 7 " bytes." ; ( ( // da classe 3esta<r=uivo

H. >mplemente o comando cat do .ni!. ' lin0a de comando do pro)rama deve ser$

java Cat nome<r=uivo, nome<r=uivoE ... nome<r=uivon

Como resultado, o conte1do de todos os ar#uivo #ue e!istam devem ser apresentados na tela. Caso al)um ar#uivo no e!ista, o comando no deve ser realizado. A classe File Esta classe uma abstrao para manipulao de ar#uivos em Java. 'l)uns de seus servios encontram/se listados na (i)ura J. ;ote #ue estes servios no so para ler ou )ravar nos ar#uivos, e sim manipul-/los. 2ais in ormaIes em$ 0ttp$//&ava.sun.com/&<se/*.=/docs/api/&ava/io/(ile.0tml.
8ile( String n boolean can4ead( boolean canBrite( boolean compare3o( Object ob String get2ame( String get>at#( String is8ile( String is%irectory( String[] list( Cria um novo ob&eto para re erenciar o ar#uivo especi icado. Betorna true ou alse, indicando se a aplicao pode ou no ler o dito ar#uivo. Betorna true ou alse, indicando se a aplicao pode ou no escrever no dito ar#uivo. Compara o nome do ar#uivo corrente com o ar#uivo passado em parCmetro. Betorna o nome do ar#uivo. Betorna o nome do camin0o do ar#uivo. Betorna true se o ob&eto se re ere a um ar#uivo. Betorna true se o ob&eto se re ere a um diretorio. Betorna um arra9 de strin)s, contendo todos os ar#uivos #ue constam no diret3rio.

Figura #. Servios de manipulao de ar#uivos. E erc!cio J. Escreva um pro)rama #ue receba como parCmetro o nome de um diret3rio. % pro)rama deve listar todos os ar#uivos deste diret3rio. Caso no se&a um diret3rio, deve ser retornada uma mensa)em ade#uada.

Manipulao de ar"uivos no $u%%eri&ada ' manipulao de ar#uivos se d- atravs das classes 8ile4eader e 8ileBriter, cu&a 0ierar#uia de classes apresentada na (i)ura L. ' (i)ura M apresenta al)uns dos servios dispon"veis nesta classe. Estas operaIes acessam diretamente os ar#uivos especi icados a cada operao.

Figura '. @ierar#uia de classes para manipulao de ar#uivos.


8ile4eader Cria um ob&eto para leitura de um ar#uivo pelo ob&eto (ile Cria um ob&eto para leitura um ar#uivo pelo nome n read9 manipular a especi icado manipular a especi icado de 8ileBriter Cria um ob&eto para manipular a escrita em um ar#uivo especi icado pelo ob&eto (ile Cria um ob&eto para manipular a n escrita de um ar#uivo especi icado pelo nome n Cria um ob&eto para manipular a n9 escrita de um ar#uivo especi icado a pelo nome n, se o parCmetro a or true, escreve no inal do ar#uivo. 'lus#9 0erdados de :rite9 2todos InputStreamBriter

8ile4eader(8ile ' 8ile4eader(String n close9 get)ncoding9 read9 ready

8ileBriter(8ile ' 8ileBriter(String 8ileBriter(String append close9 get)ncoding9 :rite9 :rite

2todos 0erdados InputStream4eader

Figura (. Servios para manipulao de streams em ar#uivos com 8ile4eader e 8ileBriter. Manipulao de ar"uivos $u%%eri&ada ' manipulao bu erizada de ar#uivos tem como principal bene icio o aumento de desempen0o )lobal nas operaIes de entrada e sa"da. Com este mecanismo, um con&unto de caracteres armazenado em um espao de dados tempor-rio antes #ue se&a necess-rio l,/lo pelo pro)rama ou escrev,/lo e etivamente no ar#uivo. % uso deste recurso se d- como se)ue. N Aeitura bu erizada
8ile4eader 'r ! ne: 8ile4eader( nomeFdoFr=uivo ; //abre o ar=uivo para leitura Gu''ered4eader in ! ne: Gu''ered4eader('r ; //cria um manipulador bu''eriHado String str; str ! in.realine( ; // le uma lin#a inteira do ar=uivo

Escrita bu erizada
Gu''eredBriter out ! ne: Gu''eredBriter(ne: 8ileBriter("Copia<r=uivo.t*t" out.:rite("3e*to" ; out.ne:Iine( ; // insere um separador de lin#a ;

's (i)uras O e *P apresentam e!emplos de manipulao bu erizada de ar#uivos. ;a (i)ura O apresentado um e!emplo de leitura a partir do teclado e a (i)ura *P apresenta um e!emplo de leitura de um ar#uivo.
import java.io.*; class IeituraConsole{ public static void main( String args[] { InputStream in ! System.in; InputStream4eader is ! ne: InputStream4eader(in ; Gu''ered4eader console ! ne: Gu''ered4eader(is ; System.out.print ("0ual J o seu nome& " ; String name ! null; try { name ! console.readIine( ; ( catc# (IO)*ception e { name ! "1" 7 e 7 "5"; ( System.out.println ("Kello "7name ; ( (

Figura ). Entrada de dados bu erizada a partir do teclado.

import java.io.*; class Ie<r=uivo { public static void main (String args [] { String 'ilename ! "Circle.java"; try { 8ile4eader 'r ! ne: 8ile4eader('ilename ; Gu''ered4eader in ! ne: Gu''ered4eader ('r ; String line; :#ile( (line!in.readIine( L! null System.out.println (line ; in.close ( ; ( catc#( IO)*ception e { System.out.println (")rro na leitura" ; ( ( (

Figura 1*. Entrada de dados bu erizada a partir do teclado. E erc!cios

L. 's classes Integer e %ouble so classes #ue permitem o armazenamento de valores inteiros e em ponto lutuante 8 os
mesmo valores #ue seus 0omQnimos int e double como tipo de dados primitivos. Estas classes possuem os se)uintes mtodos est-ticos$ o double %ouble.parse%ouble( String au* , onde au* um strin) #ue deve conter um n1mero em ponto lutuante cu&o valor retornadoR o int Integer.parseInt( String au* , onde au* um strin) #ue deve conter um n1mero em inteiro cu&o valor retornado. >mplementar uma classe de entrada de dados #ue responda a uncionalidade apresentada na documentao da classe )ntrada do pacote es.jar em 0ttp$//KKK.in .unisinos.br/S)ersonc/rep/es. M. Escreva um pro)rama #ue leia do teclado o nome e as notas de E' e ET de H alunos. % pro)rama deve escrever os dados lidos em um ar#uivo, onde a in ormao de cada aluno re)istrada em = lin0as$ a primeira com o nome, a se)unda com o E' e a terceira com o ET. Escreva um pro)rama #ue receba como parCmetro um ar#uivo #ue conten0a a in ormaIes sobre os alunos con orme especi icado no e!erc"cio anterior. :ara cada aluno deve ser calculada sua mdia. Como sa"da, deve ser )erado um novo ar#uivo, onde cada lin0a corresponde Us in ormaIes de cada aluno no se)uinte ormato$ nome, E', ET, media. ar#uivo #ue deve respeitar o ormato especi icado no e!erc"cio anterior. Esta classe deve ler o ar#uivo e )erar um novo ar#uivo no mesmo ormato com os alunos ordenados pelas suas notas 8 da maior para a menor.

O.

*P. Escreva um pro)rama #ue conten0a uma classe c0amada Iistagem. Esta classe recebe como parCmetro de construo um

Você também pode gostar