Streams I Streams I Streams de entrada/sada I Streams para acesso a cheiros I sockets I ltros I serializac~ao de objectos I exemplos Complementos de Proramac~ao e Aloritmos { LEIC Streams Abstracc~ao do Java para tratar qualquer fonte ou destino de dados e que e independente de dispositivos fsicos concretos. A leitura/escrita em streams e sequencial. Uma stream funciona como a liac~ao a um canal de comunicac~ao para qualquer dispositivo (disco, teclado, ecr~a, rede, etc) Tipos: I streams de caracteres, ou streams de texto I streams de byte, ou streams binarias Utilizac~ao: I input streams leitura de dados I output streams escrita de dados Complementos de Proramac~ao e Aloritmos { LEIC
Streams em Java de \Advanced Java Networkin", Prashant Sridharan Complementos de Proramac~ao e Aloritmos { LEIC Streams em Java de \Java Network Prorammin, M. Huhes et al. Complementos de Proramac~ao e Aloritmos { LEIC
Streams em Java de \Java Network Prorammin, M. Huhes et al. Complementos de Proramac~ao e Aloritmos { LEIC Streams { classes de java.io { Classes de E/S usando streams s~ao subclasses das classes abstractas da packae java.io: I InputStream leitura de byte I OutputStreams escrita de byte I Reader leitura de caracteres I Writer escrita de caracteres Complementos de Proramac~ao e Aloritmos { LEIC
Classes da packae java.io de \POO em JAVA", F. Mario Martins Complementos de Proramac~ao e Aloritmos { LEIC Leitura do teclado { exemplo public class Consola f public static Strin lestr() f // le uma Strin int ch; Strin r = ""; while (true) f ch = System.in.read(); if (ch < 0 jj ch == 27 jj ch == 13 jj ch == 10)f //ESC ou CR if (ch == 27) f // se for ESC tem que consumir o CR/LF!! ch = System.in.read(); ch = System.in.read(); // if (ch == 13) // se for CR tem que consumir o LF!! // ch = System.in.read(); return r; else r = r + (char) ch; catch(java.io.ioexception e) freturn r; de \POO em JAVA", F. Mario Martins Complementos de Proramac~ao e Aloritmos { LEIC
Leitura do teclado (cont.) public static int leint() f // le um inteiro while(true)f tryf return Inteer.valueOf(leStr().trim()).intValue(); catch(numberformatexception e) f System.out.println("Nao e um numero inteiro!!"); public static double ledouble() f // le um Double while(true)f tryf return Double.valueOf(leStr().trim()).doubleValue(); catch(numberformatexception e) f System.out.println("Nao e um numero em VF!!"); de \POO em JAVA", F. Mario Martins Complementos de Proramac~ao e Aloritmos { LEIC Leitura do teclado (cont.) // le um booleano public static boolean lebool() f while(true)f tryf Strin s = lestr().trim().tolowercase(); if ( s.equals("true") jj s.equals("false")) return Boolean.valueOf(s).booleanValue(); else throw new IllealArumentException(""); catch(illealarumentexception e) f System.out.println("Nao e um Booleano "); de \POO em JAVA", F. Mario Martins Complementos de Proramac~ao e Aloritmos { LEIC
Leitura de Ficheiro leitura de inteiros import java.io.*; public class LerDeFicheiro f private BueredReader cheiro; private Strin linha; public void ledeficheiro(strin NomeDoFicheiro)f cheiro = new BueredReader(new FileReader(NomeDoFicheiro)); while(true)f linha = cheiro.readline(); if(linha == null)f cheiro.close(); break; System.out.println("LINHA: "+linha); catch (FileNotFoundException e) f System.out.println("Ficheiro "+NomeDoFicheiro+" nao existe"); catch(ioexception e)f System.out.println("ERRO na leitura do cheiro"); Complementos de Proramac~ao e Aloritmos { LEIC Escrita em Ficheiro { exemplo packae chapman.io; import java.io.*; import chapman.io.fmt; public class FileOut f private PrintWriter out; // referencia para PrintWriter public nal int WRITE OK = 0; // escrita com sucesso public nal int IO EXCEPTION = -999; // excepcao de E/S public int writestatus; // estado da operacao de escrita public FileOut(Strin lename)f tryf out = new PrintWriter(new BueredWriter(new FileWriter(leName,false))); catch (IOException e) fwritestatus = IO EXCEPTION; public FileOut(Strin lename, boolean append)f tryf out = new PrintWriter(new BueredWriter( new FileWriter(leName,append))); catch(ioexception e)f writestatus = IO EXCEPTION; //usae: out.printf("time = %8.2f snn",time); public void printf(strin fmt, double x) f out.print(fmt.sprintf(fmt,x)); writestatus = WRITE OK; de \Java for Enineers and Scientists", S. J. Chapman Complementos de Proramac~ao e Aloritmos { LEIC
Escrita em Ficheiro { exemplo II { //usae: out.printf("strin = %snn",s); public void printf(strin fmt, Strin s) f out.print(fmt.sprintf(fmt,s)); writestatus = WRITE OK; public void close() f out.close(); // fecha o cheiro de entrada protected void nalize() f out.close(); super.nalize(); catch(throwable e)f System.out.println("Throwable"); de \Java for Enineers and Scientists", S. J. Chapman Complementos de Proramac~ao e Aloritmos { LEIC classe File (java.io) N~ao e uma stream. Disponibiliza metodos para as habituais operac~oes sobre cheiros e directorios I isfile() testar se e cheiro I isdirectory() vericar se e directorio I etpath() caminho ate ao directorio do cheiro I lenth tamanho do cheiro I delete() remover o cheiro I renameto() mudar o nome I list() listar directorio Complementos de Proramac~ao e Aloritmos { LEIC
Sockets: exemplo de um servidor import java.net.*; import java.io.*; class Servidor f static int porta = 1234; public static void main(strin ars[]) f ServerSocket server; Socket socket; DataInputStream input; PrintStream output; Strin line; server = new ServerSocket(porta); catch(exception e) f System.err.println(\Nao posso ouvir a porta \+porta); return; while(true) f socket = server.accept(); input = new DataInputStream(socket.etInputStream()); output = new PrintStream(socket.etOutputStream()); catch(ioexception e) f System.err.println(\Erro na criacao do socketnn"+e.etmessae()); break; line = input.readline(); catch(ioexception e) f System.err.println("Erro na leitura do socket"); output.close(); continue; output.print(\recebi:nn nn"+line+"nn "); output.close(); Complementos de Proramac~ao e Aloritmos { LEIC Sockets: exemplo de um cliente import java.net.*; import java.io.*; class Cliente f static Strin maquina = "localhost"; static int porta = 1234; public static void main(strin ar[]) f Socket socket; DataInputStream input; PrintStream output; Strin line; socket = new Socket(maquina,porta); catch(exception e) f System.err.println(\Err porta \+porta+" em \+maquina); return; input = new DataInputStream(socket.etInputStream()); output = new PrintStream(socket.etOutputStream()); catch(exception e) f System.err.println(\Falhou liacao"); return; for(int i=0; i < ar.lenth; i++) output.print(ar[i]+" "); output.println(""); output.ush(); while((line=input.readline())!= null) System.out.println(line); catch(exception e) f System.err.println(\Erro I/0"); return; Complementos de Proramac~ao e Aloritmos { LEIC
Conurac~oes tpicas de streams para E-S import java.io.*; public class IOStreamDemo f public static void main(strin[] ars) throws IOException f // 1. Readin input by lines: BueredReader in = new BueredReader(new FileReader("IOStreamDemo.java")); Strin s, s2 = new Strin(); while((s = in.readline())!= null) s2 += s + "nn"; in.close(); // 1b. Readin standard input: BueredReader stdin = new BueredReader(new InputStreamReader(System.in)); System.out.print("Enter a line:"); System.out.println(stdin.readLine()); // 2. Input from memory StrinReader in2 = new StrinReader(s2); int c; while((c = in2.read())!= -1) System.out.print((char)c); // 3. Formatted memory input DataInputStream in3 = new DataInputStream( new ByteArrayInputStream(s2.etBytes())); while(true) System.out.print((char)in3.readByte()); catch(eofexception e)fsystem.err.println("eof stream"); de Rui \'Thinkin Camachoin Java", Complementos Bruce Eckel de Proramac~ao e Aloritmos { LEIC Conurac~oes tpicas de streams para E-S // 4. File output BueredReader in4 = new BueredReader(new StrinReader(s2)); PrintWriter out1 = new PrintWriter( new BueredWriter(new FileWriter("IO.out"))); int linecount = 1; while((s = in4.readline())!= null ) out1.println(linecount++ + ": " + s); out1.close(); catch(eofexception e)fsystem.err.println("eof stream"); // 5. Storin & recoverin data DataOutputStream out2 = new DataOutputStream( new BueredOutputStream(new FileOutputStream("Data.txt"))); out2.writedouble(3.14159); out2.writeutf("that was pi"); out2.writedouble(1.41413); out2.writeutf("square root of 2"); out2.close(); DataInputStream in5 = new DataInputStream(new BueredInputStream( new FileInputStream("Data.txt"))); // Must use DataInputStream for data: System.out.println(in5.readDouble()); // Only readutf() will recover the Java-UTF Strin properly: System.out.println(in5.readUTF()); // Read the followin double and Strin: System.out.println(in5.readDouble()); System.out.println(in5.readUTF()); catch(eofexception e)fsystem.err.println("eof stream"); de Rui \'Thinkin Camachoin Java", Complementos Bruce Eckel de Proramac~ao e Aloritmos { LEIC
Conurac~oes tpicas de streams para E-S // 6. Readin/writin random access les RandomAccessFile rf = new RandomAccessFile("rtest.dat", "rw"); for(int i = 0; i < 10; i++) rf.writedouble(i*1.414); rf.close(); rf = new RandomAccessFile("rtest.dat", "rw"); rf.seek(5*8); rf.writedouble(47.0001); rf.close(); rf = new RandomAccessFile("rtest.dat", "r"); for(int i = 0; i < 10; i++) System.out.println("Value " + i + ": " + rf.readdouble()); rf.close(); de \'Thinkin in Java", Bruce Eckel Complementos de Proramac~ao e Aloritmos { LEIC Compress~ao de cheiros usando GZIP import java.util.zip.*; public class GZIPcompress f public static void main(strin[] ars) throws IOException f BueredReader in = new BueredReader(new FileReader(ars[0])); BueredOutputStream out = new BueredOutputStream(new GZIPOutputStream( new FileOutputStream("test.z"))); System.out.println("Writin le"); int c; while((c = in.read())!= -1) out.write(c); in.close(); out.close(); System.out.println("Readin le"); BueredReader in2 = new BueredReader(new InputStreamReader(new GZIPInputStream( new FileInputStream("test.z")))); Strin s; while((s = in2.readline())!= null) System.out.println(s); de \'Thinkin in Java", Bruce Eckel Complementos de Proramac~ao e Aloritmos { LEIC
Serializac~ao de objectos I Permite o armazenamento e recuperac~ao de objectos em cheiros. I Permite enviar e receber objectos atraves de uma linha de comunicac~ao. Implementac~ao de persist^encia de objectos. I Usado, por exemplo, em RMI para enviar objectos a metodos remotos. I Os objectos s~ao codicados numa sequ^encia de caracteres. I E uardada a estrutura da classe juntamente com os valores dos seus membros. I Quando ha liac~oes a outros objectos as rotinas de serializac~ao automaticamente serializam os objectos referidos no objecto a serializar. I S~ao evitados ciclos de refer^encias entre objectos Complementos de Proramac~ao e Aloritmos { LEIC Serializac~ao de objectos Escrita I classe ObjectOutputStream I metodo writeobject Leitura I classe ObjectInputStream I metodo readobject I Caso a aplicac~ao queira aplicar encriptac~ao tem que sobrep^or os metodos de escrita e leitura. I usar private transient class... quando n~ao queremos a serializac~ao de um objecto. Ou ent~ao lancar uma NoAccessException Complementos de Proramac~ao e Aloritmos { LEIC
Serializac~ao de objectos import java.io.*; class Data implements Serializable f private int i; Data(int x) f i = x; public Strin tostrin() f return Inteer.toStrin(i); public class Worm implements Serializable f // Generate a random int value: private static int r() f return (int)(math.random() * 10); private Data[] d = fnew Data(r()), new Data(r()), new Data(r()); private Worm next; private char c; // Value of i == number of sements Worm(int i, char x) f System.out.println(" Worm constructor: " + i); c = x; if({i > 0) next = new Worm(i, (char)(x + 1)); Worm() f System.out.println("Default constructor"); public Strin tostrin() f Strin s = ":" + c + "("; for(int i = 0; i < d.lenth; i++) s += d[i].tostrin(); s += ")"; if(next!= null) s += next.tostrin(); return s; de \'Thinkin in Java", Bruce Eckel Complementos de Proramac~ao e Aloritmos { LEIC Serializac~ao de objectos public static void main(strin[] ars) throws ClassNotFoundException, IOException f Worm w = new Worm(6, 'a'); System.out.println("w = " + w); ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("worm.out")); out.writeobject("worm storae"); out.writeobject(w); out.close(); // Also ushes output ObjectInputStream in = new ObjectInputStream( new FileInputStream("worm.out")); Strin s = (Strin)in.readObject(); Worm w2 = (Worm)in.readObject(); System.out.println(s + ", w2 = " + w2); ByteArrayOutputStream bout = new ByteArrayOutputStream(); ObjectOutputStream out2 = new ObjectOutputStream(bout); out2.writeobject("worm storae"); out2.writeobject(w); out2.ush(); ObjectInputStream in2 = new ObjectInputStream( new ByteArrayInputStream(bout.toByteArray())); s = (Strin)in2.readObject(); Worm w3 = (Worm)in2.readObject(); System.out.println(s + ", w3 = " + w3); de \'Thinkin in Java", Bruce Eckel Complementos de Proramac~ao e Aloritmos { LEIC
Possvel resultado Worm constructor: 6 Worm constructor: 5 Worm constructor: 4 Worm constructor: 3 Worm constructor: 2 Worm constructor: 1 w = :a(262) :b(100) :c(396) :d(480) :e(316) :f(398) Worm storae, w2 = :a(262) :b(100) :c(396) :d(480) :e(316) :f(398) Worm storae, w3 = :a(262) :b(100) :c(396) :d(480) :e(316) :f(398) de \'Thinkin in Java", Bruce Eckel Complementos de Proramac~ao e Aloritmos { LEIC