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