Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
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)
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
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$
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 (. 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 ; ( (
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" ; ( ( (
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