Streams - web.fe.up.ptrcamacho/cadeiras/cpa/acetatos/streams-2.pdf · Escrita em Ficheiro { exemplo...

13

Transcript of Streams - web.fe.up.ptrcamacho/cadeiras/cpa/acetatos/streams-2.pdf · Escrita em Ficheiro { exemplo...

Page 1: Streams - web.fe.up.ptrcamacho/cadeiras/cpa/acetatos/streams-2.pdf · Escrita em Ficheiro { exemplo package chapman.io; import java.io.*; import chapman.io.Fmt; public class FileOut

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Streams

I StreamsI Streams de entrada/sa��daI Streams para acesso a �cheirosI socketsI �ltrosI serializa�c~ao de objectosI exemplos

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEICApresenta�c~ao

Java { conceitos B�asicosJava { t�opicos espec���cos

Streams

Abstrac�c~ao do Java para tratar qualquer fonte ou destino de dados e que�e independente de dispositivos f��sicos concretos. A leitura/escrita emstreams �e sequencial. Uma stream funciona como a liga�c~ao a um canal decomunica�c~ao para qualquer dispositivo (disco, teclado, ecr~a, rede, etc)

Tipos:I streams de caracteres, ou streams de textoI streams de byte, ou streams bin�arias

Utiliza�c~ao:I input streams | leitura de dadosI output streams | escrita de dados

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 2: Streams - web.fe.up.ptrcamacho/cadeiras/cpa/acetatos/streams-2.pdf · Escrita em Ficheiro { exemplo package chapman.io; import java.io.*; import chapman.io.Fmt; public class FileOut

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Streams em Java

de \Advanced Java Networking", Prashant Sridharan

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEICApresenta�c~ao

Java { conceitos B�asicosJava { t�opicos espec���cos

Streams em Java

de \Java Network Programming, M. Hughes et al.

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 3: Streams - web.fe.up.ptrcamacho/cadeiras/cpa/acetatos/streams-2.pdf · Escrita em Ficheiro { exemplo package chapman.io; import java.io.*; import chapman.io.Fmt; public class FileOut

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Streams em Java

de \Java Network Programming, M. Hughes et al.

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEICApresenta�c~ao

Java { conceitos B�asicosJava { t�opicos espec���cos

Streams

{ classes de java.io {

Classes de E/S usando streams s~ao subclasses das classesabstractas da package java.io:

I InputStream | leitura de byte

I OutputStreams | escrita de byte

I Reader | leitura de caracteres

I Writer | escrita de caracteres

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 4: Streams - web.fe.up.ptrcamacho/cadeiras/cpa/acetatos/streams-2.pdf · Escrita em Ficheiro { exemplo package chapman.io; import java.io.*; import chapman.io.Fmt; public class FileOut

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Classes da package java.io

de \POO em JAVA", F. M�ario Martins

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEICApresenta�c~ao

Java { conceitos B�asicosJava { t�opicos espec���cos

Leitura do teclado { exemplo

public class Consola f

public static String leStr() f // le uma Stringint ch;String r = "";

while (true) ftry fch = System.in.read();if (ch < 0 jj ch == 27 jj ch == 13 jj ch == 10)f //ESC ou CRif (ch == 27) f // se for ESC tem que consumir o CR/LF !!ch = System.in.read();ch = System.in.read();

g// if (ch == 13) // se for CR tem que consumir o LF !!// ch = System.in.read();

return r;gelse r = r + (char) ch;gcatch(java.io.IOException e) freturn r;g

gg

de \POO em JAVA", F. M�ario Martins

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 5: Streams - web.fe.up.ptrcamacho/cadeiras/cpa/acetatos/streams-2.pdf · Escrita em Ficheiro { exemplo package chapman.io; import java.io.*; import chapman.io.Fmt; public class FileOut

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Leitura do teclado (cont.)

public static int leInt() f // le um inteirowhile(true)f

tryfreturn Integer.valueOf(leStr().trim()).intValue();

gcatch(NumberFormatException e)f System.out.println("Nao e um numero inteiro !!"); g

gg

public static double leDouble() f // le um Doublewhile(true)f

tryfreturn Double.valueOf(leStr().trim()).doubleValue();

gcatch(NumberFormatException e)f System.out.println("Nao e um numero em VF !!"); g

gg

de \POO em JAVA", F. M�ario MartinsRui Camacho Complementos de Programa�c~ao e Algoritmos { LEICApresenta�c~ao

Java { conceitos B�asicosJava { t�opicos espec���cos

Leitura do teclado (cont.)

// le um booleano

public static boolean leBool() fwhile(true)ftryfString s = leStr().trim().toLowerCase();if ( s.equals("true") jj s.equals("false"))return Boolean.valueOf(s).booleanValue();elsethrow new IllegalArgumentException("");

gcatch(IllegalArgumentException e)

f System.out.println("Nao e um Booleano "); gg

gg

de \POO em JAVA", F. M�ario Martins

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 6: Streams - web.fe.up.ptrcamacho/cadeiras/cpa/acetatos/streams-2.pdf · Escrita em Ficheiro { exemplo package chapman.io; import java.io.*; import chapman.io.Fmt; public class FileOut

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Leitura de Ficheiro | leitura de inteiros

import java.io.*;

public class LerDeFicheiro fprivate Bu�eredReader �cheiro;private String linha;

public void leDeFicheiro(String NomeDoFicheiro)f

try f�cheiro = new Bu�eredReader(new FileReader(NomeDoFicheiro));while(true)flinha = �cheiro.readLine();if(linha == null)f�cheiro.close();break;

gSystem.out.println("LINHA: "+linha);g

gcatch (FileNotFoundException e) fSystem.out.println("Ficheiro "+NomeDoFicheiro+" nao existe");

gcatch(IOException e)fSystem.out.println("ERRO na leitura do �cheiro");

ggg

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEICApresenta�c~ao

Java { conceitos B�asicosJava { t�opicos espec���cos

Escrita em Ficheiro { exemplo

package chapman.io;import java.io.*;import chapman.io.Fmt;

public class FileOut fprivate PrintWriter out; // referencia para PrintWriterpublic �nal int WRITE OK = 0; // escrita com sucessopublic �nal int IO EXCEPTION = -999; // excepcao de E/Spublic int writeStatus; // estado da operacao de escrita

public FileOut(String �leName)ftryf out = new PrintWriter(new Bu�eredWriter(new FileWriter(�leName,false)));gcatch (IOException e) fwriteStatus = IO EXCEPTION;g

g

public FileOut(String �leName, boolean append)ftryf out = new PrintWriter(new Bu�eredWriter( new FileWriter(�leName,append)));gcatch(IOException e)f writeStatus = IO EXCEPTION;g

g

//usage: out.printf("Time = %8.2f snn",time);public void printf(String fmt, double x) fout.print(Fmt.sprintf(fmt,x));writeStatus = WRITE OK;

gde \Java for Engineers and Scientists", S. J. Chapman

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 7: Streams - web.fe.up.ptrcamacho/cadeiras/cpa/acetatos/streams-2.pdf · Escrita em Ficheiro { exemplo package chapman.io; import java.io.*; import chapman.io.Fmt; public class FileOut

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Escrita em Ficheiro { exemplo II {

//usage: out.printf("string = %snn",s);public void printf(String fmt, String s) fout.print(Fmt.sprintf(fmt,s));writeStatus = WRITE OK;

gpublic void close() fout.close(); // fecha o �cheiro de entrada

g

protected void �nalize() ftry fout.close();super.�nalize();

gcatch(Throwable e)f System.out.println("Throwable");g

gg

de \Java for Engineers and Scientists", S. J. Chapman

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEICApresenta�c~ao

Java { conceitos B�asicosJava { t�opicos espec���cos

classe File

(java.io)

N~ao �e uma stream. Disponibiliza m�etodos para as habituaisopera�c~oes sobre �cheiros e direct�oriosI isFile() | testar se �e �cheiroI isDirectory() | veri�car se �e direct�orioI getPath() | caminho at�e ao direct�orio do �cheiroI length | tamanho do �cheiroI delete() | remover o �cheiroI renameTo() | mudar o nomeI list() | listar direct�orio

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 8: Streams - web.fe.up.ptrcamacho/cadeiras/cpa/acetatos/streams-2.pdf · Escrita em Ficheiro { exemplo package chapman.io; import java.io.*; import chapman.io.Fmt; public class FileOut

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Sockets: exemplo de um servidor

import java.net.*;import java.io.*;

class Servidor fstatic int porta = 1234;

public static void main(String args[]) fServerSocket server;Socket socket;DataInputStream input;PrintStream output;String line;

try f server = new ServerSocket(porta); gcatch(Exception e) f System.err.println(\Nao posso ouvir a porta \+porta); return; gwhile(true) ftry fsocket = server.accept();input = new DataInputStream(socket.getInputStream());output = new PrintStream(socket.getOutputStream()); gcatch(IOException e) f System.err.println(\Erro na criacao do socketnn"+e.getMessage()); break; gtry f line = input.readLine(); gcatch(IOException e) f System.err.println("Erro na leitura do socket");output.close();continue; goutput.print(\Recebi:nn|nn"+line+"nn|");output.close();

ggg Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Sockets: exemplo de um cliente

import java.net.*;import java.io.*;

class Cliente fstatic String maquina = "localhost";static int porta = 1234;

public static void main(String arg[]) fSocket socket;DataInputStream input;PrintStream output;String line;

try f socket = new Socket(maquina,porta);gcatch(Exception e) fSystem.err.println(\Err porta \+porta+" em \+maquina); return; g

try finput = new DataInputStream(socket.getInputStream());output = new PrintStream(socket.getOutputStream());

gcatch(Exception e) f System.err.println(\Falhou ligacao"); return; gfor(int i=0; i < arg.length; i++) output.print(arg[i]+" ");output.println("");output. ush();try fwhile((line=input.readLine()) != null) System.out.println(line);

gcatch(Exception e) f System.err.println(\Erro I/0"); return; g

gg Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 9: Streams - web.fe.up.ptrcamacho/cadeiras/cpa/acetatos/streams-2.pdf · Escrita em Ficheiro { exemplo package chapman.io; import java.io.*; import chapman.io.Fmt; public class FileOut

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Con�gura�c~oes t��picas de streams para E-S

import java.io.*;

public class IOStreamDemo fpublic static void main(String[] args)throws IOException f// 1. Reading input by lines:Bu�eredReader in = new Bu�eredReader(new FileReader("IOStreamDemo.java"));String s, s2 = new String();while((s = in.readLine())!= null)s2 += s + "nn";in.close();

// 1b. Reading standard input:Bu�eredReader stdin = new Bu�eredReader(new InputStreamReader(System.in));System.out.print("Enter a line:");System.out.println(stdin.readLine());

// 2. Input from memoryStringReader in2 = new StringReader(s2);int c;while((c = in2.read()) != -1)System.out.print((char)c);

// 3. Formatted memory inputtry fDataInputStream in3 = new DataInputStream( new ByteArrayInputStream(s2.getBytes()));while(true) System.out.print((char)in3.readByte());

gcatch(EOFException e)fSystem.err.println("Eof stream"); g

de \'Thinking in Java", Bruce EckelRui Camacho Complementos de Programa�c~ao e Algoritmos { LEICApresenta�c~ao

Java { conceitos B�asicosJava { t�opicos espec���cos

Con�gura�c~oes t��picas de streams para E-S

// 4. File outputtry fBu�eredReader in4 = new Bu�eredReader(new StringReader(s2));PrintWriter out1 = new PrintWriter( new Bu�eredWriter(new FileWriter("IO.out")));int lineCount = 1;while((s = in4.readLine()) != null )out1.println(lineCount++ + ": " + s);out1.close();g

catch(EOFException e)fSystem.err.println("Eof stream");g

// 5. Storing & recovering datatry fDataOutputStream out2 = new DataOutputStream( new Bu�eredOutputStream(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 Bu�eredInputStream( new FileInputStream("Data.txt")));// Must use DataInputStream for data:System.out.println(in5.readDouble());// Only readUTF() will recover the Java-UTF String properly:System.out.println(in5.readUTF());// Read the following double and String:System.out.println(in5.readDouble());System.out.println(in5.readUTF());g

catch(EOFException e)fSystem.err.println("Eof stream");gde \'Thinking in Java", Bruce EckelRui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 10: Streams - web.fe.up.ptrcamacho/cadeiras/cpa/acetatos/streams-2.pdf · Escrita em Ficheiro { exemplo package chapman.io; import java.io.*; import chapman.io.Fmt; public class FileOut

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Con�gura�c~oes t��picas de streams para E-S

// 6. Reading/writing random access �lesRandomAccessFile 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();g

g

de \'Thinking in Java", Bruce EckelRui Camacho Complementos de Programa�c~ao e Algoritmos { LEICApresenta�c~ao

Java { conceitos B�asicosJava { t�opicos espec���cos

Compress~ao de �cheiros usando GZIP

import java.util.zip.*;public class GZIPcompress fpublic static void main(String[] args)throws IOException fBu�eredReader in = new Bu�eredReader(new FileReader(args[0]));Bu�eredOutputStream out = new Bu�eredOutputStream(new GZIPOutputStream(

new FileOutputStream("test.gz")));System.out.println("Writing �le");int c;while((c = in.read()) != -1) out.write(c);in.close();out.close();System.out.println("Reading �le");Bu�eredReader in2 = new Bu�eredReader(new InputStreamReader(new GZIPInputStream(

new FileInputStream("test.gz"))));String s;while((s = in2.readLine()) != null)System.out.println(s);

gg

de \'Thinking in Java", Bruce Eckel

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 11: Streams - web.fe.up.ptrcamacho/cadeiras/cpa/acetatos/streams-2.pdf · Escrita em Ficheiro { exemplo package chapman.io; import java.io.*; import chapman.io.Fmt; public class FileOut

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Serializa�c~ao de objectos

I Permite o armazenamento e recupera�c~ao de objectos em �cheiros.I Permite enviar e receber objectos atrav�es de uma linha de comunica�c~ao.

Implementa�c~ao de persistencia de objectos.I Usado, por exemplo, em RMI para enviar objectos a m�etodos remotos.I Os objectos s~ao codi�cados numa sequencia de caracteres.I �E guardada a estrutura da classe juntamente com os valores dos seus

membros.I Quando h�a liga�c~oes a outros objectos as rotinas de serializa�c~ao

automaticamente serializam os objectos referidos no objecto a serializar.I S~ao evitados ciclos de referencias entre objectos

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEICApresenta�c~ao

Java { conceitos B�asicosJava { t�opicos espec���cos

Serializa�c~ao de objectos

EscritaI classe ObjectOutputStreamI m�etodo writeObject

LeituraI classe ObjectInputStreamI m�etodo readObject

I Caso a aplica�c~ao queira aplicar encripta�c~ao tem que sobrepor os m�etodosde escrita e leitura.

I usar private transient class ... quando n~ao queremos a serializa�c~ao de umobjecto. Ou ent~ao lan�car uma NoAccessException

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 12: Streams - web.fe.up.ptrcamacho/cadeiras/cpa/acetatos/streams-2.pdf · Escrita em Ficheiro { exemplo package chapman.io; import java.io.*; import chapman.io.Fmt; public class FileOut

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Serializa�c~ao de objectos

import java.io.*;

class Data implements Serializable fprivate int i;Data(int x) f i = x; gpublic String toString() freturn Integer.toString(i);

gg

public class Worm implements Serializable f// Generate a random int value:private static int r() freturn (int)(Math.random() * 10);

gprivate Data[] d = fnew Data(r()), new Data(r()), new Data(r())g;private Worm next;private char c;

// Value of i == number of segmentsWorm(int i, char x) fSystem.out.println(" Worm constructor: " + i);c = x;if({i > 0) next = new Worm(i, (char)(x + 1));

gWorm() fSystem.out.println("Default constructor");gpublic String toString() fString s = ":" + c + "(";for(int i = 0; i < d.length; i++) s += d[i].toString();s += ")";

if(next != null) s += next.toString();return s;

g

de \'Thinking in Java", Bruce Eckel

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEICApresenta�c~ao

Java { conceitos B�asicosJava { t�opicos espec���cos

Serializa�c~ao de objectos

public static void main(String[] args) throws ClassNotFoundException, IOException fWorm w = new Worm(6, 'a');

System.out.println("w = " + w);ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("worm.out"));out.writeObject("Worm storage");out.writeObject(w);out.close(); // Also ushes output

ObjectInputStream in = new ObjectInputStream( new FileInputStream("worm.out"));String s = (String)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 storage");out2.writeObject(w);out2. ush();

ObjectInputStream in2 = new ObjectInputStream( new ByteArrayInputStream(bout.toByteArray()));s = (String)in2.readObject();Worm w3 = (Worm)in2.readObject();System.out.println(s + ", w3 = " + w3);

gg

de \'Thinking in Java", Bruce Eckel

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC

Page 13: Streams - web.fe.up.ptrcamacho/cadeiras/cpa/acetatos/streams-2.pdf · Escrita em Ficheiro { exemplo package chapman.io; import java.io.*; import chapman.io.Fmt; public class FileOut

Apresenta�c~aoJava { conceitos B�asicosJava { t�opicos espec���cos

Poss��vel resultado

Worm constructor: 6Worm constructor: 5Worm constructor: 4Worm constructor: 3Worm constructor: 2Worm constructor: 1w = :a(262) :b(100) :c(396) :d(480) :e(316) :f(398)Worm storage, w2 = :a(262) :b(100) :c(396) :d(480) :e(316) :f(398)Worm storage, w3 = :a(262) :b(100) :c(396) :d(480) :e(316) :f(398)

de \'Thinking in Java", Bruce Eckel

Rui Camacho Complementos de Programa�c~ao e Algoritmos { LEIC