Slide 1 - IME-USP

Propaganda
Programação Distribuída em
Java
Aula 02
Na aula passada vimos:
• Introdução
– O que podemos fazer na rede
• Conceito de Rede
– Máquinas conectadas
• Protocolos
– Conceito e exemplos
2
Na aula passada vimos:
• Modelo ISO/OSI
–
–
–
–
–
–
–
Aplicação
Apresentação
Sessão
Transporte
Rede
Enlace
Física
• TCP/IP
– Uma simplificação do OSI
3
Na aula passada vimos:
• Modelo Cliente/Servidor
– Formato de interação entre máquinas
4
O que você deve ter fixado:
• Funcionamento básico de uma rede
• Modelo de camadas
• Interação cliente/servidor
5
Na aula de hoje veremos:
• I/O
6
I/O
• A maior parte do que um programa em
rede faz é simples entrada e saída
• Ler a informação enviada por um servidor
é muito parecido com a leitura de um
arquivo do sistema local
7
I/O
• I/O em Java é basicamente manipulação
de streams
• Depois que um stream é criado podemos
até ignorar o seu tipo original graças ao
polimorfismo
8
java.io.OutputStream
• Classe abstrata que fornece os métodos
fundamentais para escrita de dados em
um meio particular
• Todas as subclasses de OutputStream
têm o mesmo comportamento
– Se você sabe usar a superclasse deverá entender o
funcionamento das subclasses
9
java.io.OutputStream
• Métodos básicos:
– public abstract void write (int b) trows IOException
– public abstract void write (byte [] data) trows IOException
– public abstract void write (byte [] data, int offset, int length )
trows IOException
– public void flush() trows IOException
– public void close()
CharGenerator.java
10
java.io.OutputStream
• Quando utilizar o método flush() sobre
OutputStreams?
• Sempre!
• Streams podem ser armazenados em
buffer
• flush força o envio de dados que do
contrário seriam perdidos
11
java.io.InputStream
• Classe abstrata que fornece os métodos
fundamentais para leitura de dados em
um meio particular
12
java.io.InputStream
• Métodos básicos:
–
–
–
–
–
–
public abstract read()
public int read (byte[] input)
public int read (byte[] input, int offset, int length)
public long skip()
public int available()
public void close()
– Todos lançam IOException
13
java.io.InputStream
• read () bloqueia a execução do programa
até que um byte esteja disponível
• Entrada e saída tendem a ser processos
lentos
• É recomendável que ocorram em threads
dedicadas
SaveLoad.java
14
java.io.InputStream
• Para garantir que todos os bytes sejam lidos
você deve colocar read() em loop
byte[] input = new byte[1024];
int bytesRead = in.read(input);
int bytesRead = 0;
int bytesToRead = 1024;
byte[] input = new byte[bytesToRead];
while( bytesRead < bytesToRead ) {
bytesRead += in.read(input, bytesRead, bytesToRead –
bytesRead);
}
15
16
Filter Streams
• Input e OutputStream permitem apenas a
inscrição e leitura de bytes... e só
• Devido à existência de formatos de dados
muito comuns, existem classes que dão
tratamento especializado para os mesmos
17
Filter Streams
• Filtros manipulam streams fazendo
compressão, criptografia, conversão para
caracteres, buffer e etc...
• Filtros podem modificar os dados
enquanto são lidos ou escritos
– e.g. filtro de compressão ou criptografia
18
Filter Streams
• Vários filtros podem ser encadeados
• Na maioria das vezes devemos usar o
último filtro da cadeia para ler ou escrever
dados
19
Filter Streams
FileInputStream fis = new FileInputStream(data.txt);
BufferedInputStream bis = new BuferredInputStream(fis);
DataInputStream dis = new DataInputStream(bis);
Mas quem fará a leitura?
InputStream in = new FileInputStream(data.txt);
in = new BuferredInputStream(in);
in = new DataInputStream(in);
in.read();
Essa é uma melhor opção
20
21
Readers and Writers
• Assim como Input e OutputStream usam
bytes, readers e writers usam caracteres
Unicode
veja: http://pt.wikipedia.org/wiki/Unicode
• São chamadas “classes espelho”, pois
têm basicamente os mesmos métodos
que InputStream e OutputStream
ListIt.java
22
java.io.OutputStreamWriter
• Recebe caracteres Unicode e os converte
para bytes
• É análoga a OutputStream
• Como exercício compare os métodos
dessa classe com os de OutputStream
23
java.io.InputStreamReader
• Análoga a InputStream
• Seus métodos podem ser entendidos
comparando-os aos de InputStream
24
Application
InputStreamReader
Suponha que você
receba dados
compactados e
criptografados.
Qual seriam os
passos para tratar
esses dados desde
que chegam da rede
até que possam ser
lidos?
GZIPInputStream
CipherInputStream
BufferedInputStream
TelnetInputStream
Network
25
26
In short:
• Obtenha um stream
• Trate-o com um filtro apropriado
• Conclua a sua manipulação com um
reader ou writer
Save and Load.java
27
O que você precisa saber...
• Tratamento básico de entrada e saída em
Java
• Encadeamento de filtros
28
Na próxima aula veremos:
• Sockets
• ServerSockets
29
Download