Upload
vodan
View
219
Download
0
Embed Size (px)
Citation preview
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
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
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
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
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
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
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
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
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
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
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
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
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