Streams
I
Streams
I
Streams de entrada/sada
I
Streams para acesso a cheiros
Isockets
I
ltros
I
serializac~ao de objectos
Iexemplos
Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC
Apresentac~ao Java { conceitos Basicos
Java { topicos especcos
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 ligac~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
Streams em Java
de \Advanced Java Networking", Prashant Sridharan
Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC
Apresentac~ao Java { conceitos Basicos
Java { topicos especcos
Streams em Java
de \Java Network Programming, M. Hughes et al.
Streams em Java
de \Java Network Programming, M. Hughes et al.
Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC
Apresentac~ao Java { conceitos Basicos
Java { topicos especcos
Streams
{ classes de java.io {
Classes de E/S usando streams s~ao subclasses das classes
abstractas da package java.io:
I
InputStream | leitura de byte
I
OutputStreams | escrita de byte
I
Reader | leitura de caracteres
I
Writer | escrita de caracteres
Classes da package java.io
de \POO em JAVA", F. Mario Martins
Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC
Apresentac~ao Java { conceitos Basicos
Java { topicos especcos
Leitura do teclado { exemplo
public class Consola f
public static String leStr() f // le uma String int ch; String r = ""; while (true) f try 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(); g
// if (ch == 13) // se for CR tem que consumir o LF !! // ch = System.in.read(); return r; g else r = r + (char) ch; g catch(java.io.IOException e) freturn r;g g g
de \POO em JAVA", F. Mario Martins
Leitura do teclado
(cont.)
public static int leInt() f // le um inteiro
while(true)f
tryf
return Integer.valueOf(leStr().trim()).intValue();
g
catch(NumberFormatException e)
f System.out.println("Nao e um numero inteiro !!"); g
g
g
public static double leDouble() f // le um Double
while(true)f
tryf
return Double.valueOf(leStr().trim()).doubleValue();
g
catch(NumberFormatException e)
f System.out.println("Nao e um numero em VF !!"); g
g
g
de \POO em JAVA", F. Mario Martins
Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC
Apresentac~ao Java { conceitos Basicos
Java { topicos especcos
Leitura do teclado
(cont.)
// le um booleano
public static boolean leBool() f
while(true)f
tryf
String s = leStr().trim().toLowerCase();
if ( s.equals("true") jj s.equals("false"))
return Boolean.valueOf(s).booleanValue();
else
throw new IllegalArgumentException("");
g
catch(IllegalArgumentException e)
f System.out.println("Nao e um Booleano "); g
g
g
g
Leitura de Ficheiro |
leitura de inteiros
import java.io.*;
public class LerDeFicheiro f private BueredReader cheiro; private String linha;
public void leDeFicheiro(String NomeDoFicheiro)f try f
cheiro = new BueredReader(new FileReader(NomeDoFicheiro)); while(true)f linha = cheiro.readLine(); if(linha == null)f cheiro.close(); break; g System.out.println("LINHA: "+linha); g g catch (FileNotFoundException e) f
System.out.println("Ficheiro "+NomeDoFicheiro+" nao existe"); g
catch(IOException e)f
System.out.println("ERRO na leitura do cheiro"); g
g g
Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC
Apresentac~ao Java { conceitos Basicos
Java { topicos especcos
Escrita em Ficheiro { exemplo
package 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(String leName)f
tryf out = new PrintWriter(new BueredWriter(new FileWriter(leName,false))); g
catch (IOException e) fwriteStatus = IO EXCEPTION;g g
public FileOut(String leName, boolean append)f
tryf out = new PrintWriter(new BueredWriter( new FileWriter(leName,append))); g
catch(IOException e)f writeStatus = IO EXCEPTION;g g
//usage: out.printf("Time = %8.2f snn",time); public void printf(String fmt, double x) f
out.print(Fmt.sprintf(fmt,x)); writeStatus = WRITE OK; g
de \Java for Engineers and Scientists", S. J. Chapman
Escrita em Ficheiro
{ exemplo II {
//usage: out.printf("string = %snn",s);
public void printf(String fmt, String s) f
out.print(Fmt.sprintf(fmt,s));
writeStatus = WRITE OK;
g
public void close() f
out.close(); // fecha o cheiro de entrada
g
protected void nalize() f
try f
out.close();
super.nalize();
g
catch(Throwable e)f System.out.println("Throwable");g
g
g
de \Java for Engineers and Scientists", S. J. Chapman
Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC
Apresentac~ao Java { conceitos Basicos
Java { topicos especcos
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
getPath() | caminho ate ao directorio do cheiro
I
length | tamanho do cheiro
I
delete() | remover o cheiro
I
renameTo() | mudar o nome
I
list() | listar directorio
Sockets:
exemplo de um servidor
import java.net.*; import java.io.*; class Servidor f
static int porta = 1234;
public static void main(String args[]) f ServerSocket server;
Socket socket;
DataInputStream input; PrintStream output; String line;
try f server = new ServerSocket(porta); g
catch(Exception e) f System.err.println(\Nao posso ouvir a porta \+porta); return; g while(true) f
try f
socket = server.accept();
input = new DataInputStream(socket.getInputStream()); output = new PrintStream(socket.getOutputStream()); g
catch(IOException e) f System.err.println(\Erro na criacao do socketnn"+e.getMessage()); break; g try f line = input.readLine(); g
catch(IOException e) f System.err.println("Erro na leitura do socket"); output.close(); continue; g output.print(\Recebi:nn|nn"+line+"nn|"); output.close(); g g
g Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC
Apresentac~ao Java { conceitos Basicos
Java { topicos especcos
Sockets:
exemplo de um cliente
import java.net.*; import java.io.*; class Cliente f
static String maquina = "localhost"; static int porta = 1234;
public static void main(String arg[]) f Socket socket;
DataInputStream input; PrintStream output; String line;
try f socket = new Socket(maquina,porta);g catch(Exception e) f
System.err.println(\Err porta \+porta+" em \+maquina); return; g try f
input = new DataInputStream(socket.getInputStream()); output = new PrintStream(socket.getOutputStream()); g
catch(Exception e) f System.err.println(\Falhou ligacao"); return; g for(int i=0; i < arg.length; i++) output.print(arg[i]+" ");
output.println(""); output. ush(); try f
while((line=input.readLine()) != null) System.out.println(line); g
catch(Exception e) f System.err.println(\Erro I/0"); return; g g
Congurac~oes tpicas de streams para E-S
import java.io.*;
public class IOStreamDemo f
public static void main(String[] args) throws IOException f
// 1. Reading input by lines:
BueredReader in = new BueredReader(new FileReader("IOStreamDemo.java")); String s, s2 = new String();
while((s = in.readLine())!= null) s2 += s + "nn";
in.close();
// 1b. Reading 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
StringReader in2 = new StringReader(s2); int c;
while((c = in2.read()) != -1) System.out.print((char)c); // 3. Formatted memory input try f
DataInputStream in3 = new DataInputStream( new ByteArrayInputStream(s2.getBytes())); while(true) System.out.print((char)in3.readByte());
g
catch(EOFException e)fSystem.err.println("Eof stream"); g
de \'Thinking in Java", Bruce EckelRui Camacho Complementos de Programac~ao e Algoritmos { LEIC
Apresentac~ao Java { conceitos Basicos
Java { topicos especcos
Congurac~oes tpicas de streams para E-S
// 4. File output try f
BueredReader in4 = new BueredReader(new StringReader(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();
g
catch(EOFException e)fSystem.err.println("Eof stream");g // 5. Storing & recovering data
try f
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 String properly: System.out.println(in5.readUTF());
// Read the following double and String: System.out.println(in5.readDouble()); System.out.println(in5.readUTF()); g
Congurac~oes tpicas de streams para E-S
// 6. Reading/writing 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();
g
g
de \'Thinking in Java", Bruce Eckel
Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC
Apresentac~ao Java { conceitos Basicos
Java { topicos especcos
Compress~ao de cheiros usando GZIP
import java.util.zip.*; public class GZIPcompress f
public static void main(String[] args) throws IOException f
BueredReader in = new BueredReader(new FileReader(args[0]));
BueredOutputStream out = new BueredOutputStream(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");
BueredReader in2 = new BueredReader(new InputStreamReader(new GZIPInputStream( new FileInputStream("test.gz"))));
String s;
while((s = in2.readLine()) != null) System.out.println(s);
g g
de \'Thinking in Java", Bruce Eckel
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 guardada a estrutura da classe juntamente com os valores dos seus
membros.
I
Quando ha ligac~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
Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC
Apresentac~ao Java { conceitos Basicos
Java { topicos especcos
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
Serializac~ao de objectos
import java.io.*;
class Data implements Serializable f private int i;
Data(int x) f i = x; g public String toString() f
return Integer.toString(i); g
g
public class Worm implements Serializable f // Generate a random int value:
private static int r() f
return (int)(Math.random() * 10); g
private Data[] d = fnew Data(r()), new Data(r()), new Data(r())g; private Worm next;
private char c;
// Value of i == number of segments Worm(int i, char x) f
System.out.println(" Worm constructor: " + i); c = x;
if({i > 0) next = new Worm(i, (char)(x + 1)); g
Worm() f
System.out.println("Default constructor"); g
public String toString() f String 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 Programac~ao e Algoritmos { LEIC
Apresentac~ao Java { conceitos Basicos
Java { topicos especcos
Serializac~ao de objectos
public static void main(String[] args) 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 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); g
g
de \'Thinking in Java", Bruce Eckel
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 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