A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Um Curso Orientado a Objetos

Apresentações semelhantes


Apresentação em tema: "Um Curso Orientado a Objetos"— Transcrição da apresentação:

1 Um Curso Orientado a Objetos
A Linguagem Java Um Curso Orientado a Objetos

2 Características de Java
Linguagem totalmente Orientada a Objetos Portabilidade Alta Performance (?!) Facilidades para Processamento Distribuído Ambiente Seguro Neutra em relação a arquiteturas Linguagem Robusta ver artigo: The Java Language Environment

3 Compiler 01001... PC hardware Java Virtual Machine JAVA files
Compiler JAVA files Class byte code files PC hardware CPP files .exe program

4 Compile-Time Run-Time Compiler Interpreter Bytecodes Class Source
Loader Interpreter Bytecodes Byte Code Verifier Run-Time Classes JAVA Virtual Machine Security Manager

5

6 A plataforma Java (i) Plataforma: ambiente de software e de hardware, no qual um programa é executado. Componentes da plataforma Java: A Máquina Virtual Java (JVM) A Interface para Programação de Aplicações Java (API) A API é uma vasta coleção de componentes de software já prontos, que fornecem uma série de funcionalidades.

7 A plataforma Java (ii) Os componentes que integram a API Java são agrupados em packages (fisicamente equivalentes a diretórios) de classes e interfaces relacionadas. A API e a JVM isolam o programa do hardware subjacente.

8 A plataforma Java (iii)
Toda implementação completa da plataforma Java fornece as seguintes facilidades: Ferramentas de desenvolvimento (para compilar, executar, debugging e documentar as aplicações) API (inúmeras classes...) Deployment technologies (Java Web Start, Java Plug-in) User Interface Toolkits (Swing, Java2D) Integration Libraries (Java RMI, JNDI [Java Naming and Directory Inteface])

9 Impactos de Java na programação
Rápida curva de aprendizado Escreve-se menos código Programa-se melhor Desenvolvimento mais rápido de programas Evita dependência de plataformas Portabilidade (write one, run anywhere) Distribuição de software mais fácil

10 A aplicação "Hello World!"
"Hello World!" for the NetBeans IDEhttp://docs.oracle.com/javase/tutorial/getStarte d/cupojava/netbeans.html "Hello World!" for Microsoft Windowhttp://docs.oracle.com/javase/tutorial/getS tarted/cupojava/win32.html "Hello World!" for Solaris OS and Linuxhttp://docs.oracle.com/javase/tutorial/getStar ted/cupojava/unix.html

11 Alguns conceitos de P.O.O.
Objeto Classe Herança Interface Package

12 Objeto (i) Objeto é uma representação de algo existente no “mundo real”. Exs.: uma certa lâmpada, um determinado rádio, etc. Objetos possuem estado (state) e comportamento (behaviour). Alguns objetos contêm outros objetos... Objetos armazenam o seu estado em fields (instance variables).

13 Objeto (ii) O comportamento de um objeto é realizado através de métodos. Os métodos operam no estado interno dos objetos e servem como mecanismo de comunicação entre objetos (via troca de mensagens ou invocação de métodos). Encapsulamento de dados (information hiding): quando se oculta o estado interno do objeto e as operações sobre o objeto são efetuadas apenas pelos métodos (do objeto em questão).

14 Objeto (iii) Benefícios de se agregar código aos objetos:
Modularidade (particionamento do espaço de estados de um problema, simplificando-o) Information hiding Reuso de código Capacidade de associar/conectar componentes (lego like) Facilidade em debugging

15 Classe É um padrão/template/fôrma a partir da qual objetos de um mesmo tipo são criados. Uma classe é uma abstração. Uma abstração denota as características essenciais de um objeto, que o distingüe de todos os outros tipos de objetos e, assim, fornece fronteiras conceituais bem definidas, relativas à perspectiva do observador (Booch) Uma classe possibilita a caracterização daquilo que compreende o estado dos objetos de um mesmo tipo, bem como do conjunto de operações(comportamento) aplicáveis a esses objetos . Class Bicycle .html

16 Herança representa uma hierarquia de abstrações, em que uma subclasse herda de uma ou mais superclasses. Tipicamente a subclasse aumenta ou redefine a estrutura e o comportamento de uma ou mais classes. Eou seja, a subclasse herda a carcterização do estado e o comportamento de uma ou mais classes. Usa a keyword extends. Exemplo:

17 Interface Os objetos interagem com o mundo externo via os seus métodos. Os métodos formam a interface com o mundo externo. Em sua forma mais comum, uma interface é um grupo de métodos com o corpo vazio (i.e. sem o algoritmo que implementa o comportamento referenciado pelo nome do método.)

18 Exemplo de Interface interface Bicycle {
// wheel revolutions per minute void changeCadence(int newValue); void changeGear(int newValue); void speedUp(int increment); void applyBrakes(int decrement); }

19 Implementação de Interface
class ACMEBicycle implements Bicycle { // remainder of this class // implemented as before in class Bicycle }

20 Package Um package é um namespace (contexto para identificadore) que organiza um conjunto de classes e interfaces relacionadas. Pode-se pensar em packages como sendo “equivalentes” a diretórios. A plataforma Java fornece uma imensa biblioteca de classes (organizadas como um conjunto de packages) - Application Programming Interface - API - que podem ser usadas por aplicações Java. A API JAva permite ao programador focar no desenvolvimento dos aspectos particulares de sua aplicação, sem se preocupar com a infra-estrutura necessária.

21 Tudo em Java é objeto Exceção (parcial): os tipos de dados primitivos. Estes tipos são padronizados para todas as plataformas. São eles: Data Type Size byte 8-bit short 16-bit int 32-bit long 64-bit float 32-bit floating point double 64-bit floating point char 16-bit Unicode

22 Literais (i)‏ São usados para representar os tipos de dados primitivos. Iniciando com: 0 ---> octais 0x ou 0X ---> hexadecimais literais maiores que 0x7FFFFFFF ( ) são automaticamente assumidos como long. Qualquer literal inteiro seguido de l ou L é um long. floating-point: contêm expoente ou ponto decimal. Podem ser float ou double. Por default são do tipo double. Ex.: , 0.1, 10E-13, 2.5 E12 (double)‏ Float: 45.34F, 0.1F, F, 11.3E-23F. Double:23.52D, E-3D.

23 Literais (ii)‏ Booleans: Podem assumir um dos dois valores (constantes) true ou false. Não pode haver cast para inteiros. Character: são representados por um único caracter entre aspas. Ex.: ‘a’, ‘ ‘. Um character pode também ser definido por : ‘\xNN’, onde NN é o valor UNICODE do caracter. Seqüências de escape são usadas para representar caracteres especiais e são precedidas por uma barra invertida (\). Ex.: \n new line \t tab \r carriage return \b backspace

24 Variáveis (i)‏ Em JAVA há três tipos de variáveis: instance, class e local. Local: são variáveis declaradas dentro de métodos ou blocos. Forma geral: <type> <variable name> double pi; int count; public GetHalf () { int half; // variável local half = FirstVariable / 2; return half; }

25 Variáveis (ii)‏ Instance: São definidas para uma instância de um objeto. Class FirstClass { int FirstVariable = 0; //inicializa com zero //Atribui valor à variável public void SetValue (int NewValue) { FirstVariable = NewValue; } // Obtém o valor da variável public int GetValue ( ) { return FirstVariable; No caso, FirstVariable é uma variável tipo instance.

26 Variáveis (iii)‏ São declaradas usando-se a keyword static
Variáveis class são empregadas para definir dados que são associados à classe e, não aos objetos instanciados. São declaradas usando-se a keyword static Class BankAccount { // inicialização dos números das contas static private int m_nNextAccountNumber = 1001; // declaração de outros membros ... // declaração de outros métodos

27 Precedência dos Operadores*
. [] ()‏ ! ~ instanceof * / % + - << >> >>> < > <= >= = = != & ^ | && (short circuit evaluation)‏ || (short circuit evaluation)‏ ?: = op= , *Ver Peter van der Linden, Just Java, pg. 87

28 JAVA Keywords JAVA C byte boolean char struct union
try catch finally throw C int short long enum private public protected signed unsigned float double transient synchronized if else for while do short long extern native final finally switch case default threadsafe abstract auto register break continue return static import class extends volatile sizeof const instanceof implements typedef interface package null new true false this super

29 Fluxo de Controle (i)‏ if statement for loop while loop
switch statement

30 Fluxo de Controle (ii)‏
if statement if (boolean expression) { //... qualquer número de comandos } else {

31 Fluxo de Controle (iii)‏
while loop while (boolean expression) { //... qualquer número de comandos } do { } while (boolean expression);

32 Fluxo de Controle (iv)‏
for loop for (expr1; expr2; expr3) { //...qualquer número de comandos } Equivalente a: avalia expr1; //inicialização do loop while (expr2) { //... Qualquer número de comandos avalia expr3 // expressão para controlar o loop

33 Fluxo de Controle (v)‏ switch statement switch (expr) { case cexpr1:
// comandos JAVA break; case cexpr2: ... case cexprn: default: // mais comandos JAVA }

34 Arrays (i)‏ Não se pode declarar um array com um tamanho pré-definido.
Deve ser declarado como uma variável não inicializada. Podem ser usados para classes e tipos primitivos de dados int numbers[]; //para arrays de inteiros String myStrings []; // para arrays de objetos do tipo string String[] myStrings; //forma alternativa O próximo passo é criar o array através do uso do operador new. Constrói-se uma instância do objeto. int numbers[] = new int[5]; //array de inteiros, de dimensão 5. String myStrings[] = new Strings[20] ; //array de Objetos String, de dimensão 20.

35 Arrays (ii)‏ Os slots ainda nada contêm. Todavia são inicializados com valores default (inteiros: 0; objetos String: null). Finalmente atribuem-se valores aos elementos do array. myStrings[0] = “My first String”; myStrings[1] = “My second String”; numbers[0] = 20; IndexOutOfBoundException (índice inválido)‏ Uma variável instância pública chamada length é usada para se obter o tamanho do array. Int q = numbers.length; // q = 5

36 Arrays (iii)‏ JAVA não suporta arrays multidimensionais
Podem ser simulados através de arrays de arrays int k[][] = new int[5][4]; k[1][3] = 100; //atribui valor a um dos elementos do array Outra forma de se criar um array: int z[][]; int outerSize = 5; int innerSize = 4; z = new int[outerSize][innerSize];

37 class TestArray { public static void main (String args[]) { int z[][]; int outerSize = 5; int innerSize = 4; z = new int[outerSize][innerSize]; int i, j , k; // linha --> i; coluna --> j for (i = 0, k = 0; i < innerSize; i++)‏ for (j = 0; j < outerSize; j++) { z[j][i] = k++; System.out.println("i = " + i + " j = " + j + " " + z[j][i]); } int w[][] = new int[10][]; w[0] = new int[5]; w[3] = new int[3]; System.out.println (w.length + " " + w[0].length + " "+ w[3].length); w[10] = new int[3]; // OutOfBoundException /* int y[][] = new int [10][]; // missing array dimension y[0][] = new int [5]; // missing array index y[][2] = new int [10]; */

38 Estrutura de um Programa em JAVA
Um progama em JAVA é composto de classes Apenas uma classe implementa o método main(). As classes em JAVA podem estar em múltiplos arquivos (compilation units)‏ cada arquivo fonte termina com o sufixo .java Cada classe contém data members (declarações de tipos de dados) e methods (funções que operam nos data members da classe)‏ O conjunto de classes em uma unidade de compilação podem fazer parte de um mesmo package. Isto significa que todas as classes serão pré-fixadas com o nome do package. O comando import instrui o compilador para carregar uma determinada classe que está em uma outra unidade de compilação. O comando interface especifica um conjunto de métodos que descrevem, em alto nível, um comportamento determinado.

39 Estrutura de um Programa em JAVA
package mystech.util; /* OPTIONAL - these classes may belong to a package */ import java.util.Vector; /* OPTIONAL - import other classes for use in this class */ interface InputOutput { /* OPTIONAL - an interface is a group of methods */ void read(); void write(); } /* OPTIONAL - multiple classes per file */ class aCLass { ... ... class mainClass { public static void main(String args[])‏ { ...

40 Executando um Programa em JAVA
Para compilar um programa em bytes codes independentes de arquitetura: javac <filename> filename é um arquivo .java O compilador gera um arquivo <classname>.class para cada classe. Cada arquivo contém os byte-codes para a classe correspondente . O interpretador JAVA executa os byte-codes java <classname>

41 Standalone Application
public class App1_1 { public static void main(String args[])‏ System.out.println("Hello, world"); }

42 Applets import java.applet.Applet; import java.awt.*;
public class HelloMan extends Applet { public void paint(Graphics g)‏ g.drawString("Hello, world", 0, 20); } <HTML> <HEAD> <TITLE>Hello World</TITLE> </HEAD> <BODY> <APPLET CODE="HelloMan.class" WIDTH=250 HEIGHT=100> </APPLET> </BODY> </HTML>

43 Objetos e Classes em JAVA (i)‏
Classes são os templates para especificar o estado e comportamento de um objeto em tempo de execução. Objeto é uma instância de uma classe. Classes consistem de data members (instance variables) e métodos. Após a definição de uma classe, pode-se criar os objetos correspondentes através do operador new. O operador new aloca memória para o objeto inicializa variáveis de instância chama um construtor Construtores: são métodos que são chamados quando o objeto é instanciado. Provêem inicializações adicionais para o objeto.

44 Objetos e Classes em JAVA (ii)‏
Métodos: especificam o comportamento dos objetos Os métodos possuem duas partes: definição e corpo. Definição: Possui três componentes (signature): valor retornado o nome do método uma lista de parâmetros Corpo: algoritmo que opera sobre os data members. Os métodos podem declarar variáveis locais. Os métodos podem ser sobrecarregados (em particular, os construtores) - Overloading -

45 Exemplos de classes em JAVA
Conta Bancária Learn Java Now . Stephen R. Davis. Microsoft Press. Pág. 41. Chap03/BankAccount/BankAccount.java Livros e Estantes Java for C/C++ Programmers. Michael C. Daconta. John Wiley & Sons, Inc. Pág. 15 e 17. SRC1-4.java e SRC1-5.java

46 Exemplos de programas em JAVA
Uso da classe Conta Bancária Learn Java Now . Stephen R. Davis. Microsoft Press. Pág. 43. Chap03/BankAccount/App1_3.java Livros e Estantes Java for C/C++ Programmers. Michael C. Daconta. John Wiley & Sons, Inc. Pág. 18 e 20. SRC1-6.java SRC1-7.java (versão com GUI)‏

47 Method Signature Os métodos possuem duas partes: definição e corpo.
A definição deve possuir pelo menos três partes: valor retornado nome lista de parâmetros A signature de um método compreende o valor retornado pelo método, o nome do método e a sua lista de parâmetros.

48 Overloading Methods (i)‏
Métodos com o mesmo nome para diferentes classes Solução: qualificar o nome por completo. void fn(TV my tv, Radio myradio)‏ { mytv.ChangeChannel(); //troca o canal da tv myradio.ChangeChannel(); //troca a estação do radio }

49 Overloading Methods (ii)‏
Quando o método é chamado de dentro da classe não é necessária a qualificação completa class TV { void ChangeChannel() { //código do método ... } void SomeFunction() { ChangeChannel();

50 Overloading Methods (iii)‏
Métodos com o mesmo nome para a mesma classe Solução: a distinção entre os métodos é feita através dos argumentos class BankAccount { double m_dCurrentInterestRate; // the Account’s interest rate // Rate - inquire or set interest rate double Rate() { return m_dCurrentInterestRate; } double Rate(double dNewRate) { if (dNewRate > 0.0 && dNewRate < 20.0) { m_dCurrentInterestRate = dNewRate;

51 Overloading Methods (iv)‏
... BankAccount baMyAccount baMyAccount.Rate (0.8); // estabelece a taxa baMyAccount.Rate (): // recupera a taxa corrente

52 Overloading Methods (v)‏
Observação: Não é possível diferenciar dois métodos apenas em função do valor retornado. class RealNumber { // convert current RealImaginary number to a double double Convert (); //convert current RealImaginary number to a int int Convert (); } // Dá origem ao seguinte problema: void Fn(RealNumber rn) { rn.Convert (); // qual dos Convert devo usar???

53 Overloading Constructors
Ver o exemplo JustJavaBook/examples/ch2/test2c.java

54 Herança Ver o exemplo JavaNow/chap07/BankAccount/BankAccount.java
/App1_7.java

55 Polimorfismo Ver o exemplo JustJavaBook/example/ch2/test2e.java

56 Garbage Collector Além do gerenciamento de objetos em memória o Java run-tyme system mantém um registro de todas as referências aos objetos. Quando um objeto não é mais referenciado ele é automaticamente removido da memória. O programador é liberado da tarefa (error prone) de retornar ao espaço disponível os objetos que foram previamente alocados. O Garbage Collector é executado como um thread de baixa prioridade nos momentos em que a máquina encontra-se inativa. A área de memória ocupada pelos objetos não é necessariamente liberada de imediato. O Garbage Collector pode ser explicitamente chamado: System.gc ( ); // jamais faça isso em loops.

57 Membros Estáticos Class Members: são propriedades que são compartilhadas por todos objetos de uma mesma classe. São também chamados de membros estáticos class Bank Account; { // a taxa de juros é para ser compartilhada por todas as contas // bancárias. static double m_dCurrentInterestRate; ... }

58 Métodos Estáticos São métodos que são compartilhados por todos os objetos de uma classe. Não possuem a referência this. Os métodos estáticos são invocados usando-se o nome da classe. Exemplos: Learn Java Now . Stephen R. Davis. Microsoft Press. Pág. 62 e 64. Chap04/BankAccount/BankAccount.java Chap04/BankAccount/App1_4.java

59 Modificadores de Acesso
Controlam o nível de visibilidade que os métodos e data members de uma classe terão para as outras classes. Public: indica que se pode ter acesso ao método ou data member assim declarado em uma dada classe X, a partir de qualquer classe ou método que tenha visibilidade da classe X. Protected: o acesso é restrito apenas às subclasses da classe protected. Private: o método ou data member não está disponível para qualquer outra classe, exceto para aquela onde ele aparece. Package (friendship ?): é o acesso default. Nào corresponde diretamente a uma keyword de acesso. Quando se cria um package (biblioteca de classes), se não se especifica um modificador de acesso para um dado método ou dm, todas as outras classes do package poderão ter acesso ao mesmo.

60 Java Standard Library Compreende os packages: lang util io net awt
applet

61 Lang Package Compreende as classes que formam o núcleo da linguagem Java. Type Wrappers: Number, Character, Boolean, Double, Long, Float, Integer Superclasses Abstratas: Class, Object Strings: String, StringBuffer System Information: System, Process, Runtime, ClassLoader, SecurityManager Funções Matemáticas: Math Threads: Thread, Thread Group Run Time Errors: StackOverFlowError, OutOfMemoryError... Exceções: ClassNotFoundException, Throwable ...

62 Util package Compreendem objetos utilitários que ajudam aos programas manipular e armazenar outros objetos eficientemente. Containers: HashtableEntry, Properties, Vector, VectorEnumerator, Stack, ObserverList, BitSet, Dictionary Miscelaneous: Random, Date, StringTokenizer, NoSuchElementException.

63 IO package Comprende classes que oferecem facilidades para input e output. InputStreams (analogia com fluxo contínuo, permitindo redirecionamento de dados): InputStream, ByteArrayInputStream, FilterInputstream, PushbackInputStream, StringBufferInputStream, DataInputStream, BufferedInputStream, LineNumberInputStream, SequenceInputStream, PipedInputStream, StreamTokenizer. OutputStreams: OutputStream, DataOutputStream, BufferedOutputStream, PrintStream, FilterOutputStream, ByteArrayOutputStream,PipedOutputStream. Files (estas classes compreendem os armazéns de dados - ou data pools - que os streams usam para destino ou origem dos dados): File, File FileImputStream, FileOutputStream, RandomAccessFile Exceções: IOException, InterruptedIOException,FileNotFoundException, EOFException, UTFDataFormatException.

64 Net package Consiste de classes para comunicar com outros computadores (via sockets) e com servidores internet (http, ftp, etc...). WebTools (conjunto de classes para conectar e processar URLs - Uniform Resource Locators): InetAddress, URL, URLConnection, URLStreamHandler, ContentHandler. Sockets (Um socket é um modo simples de conectar processos em diferentes máquinas, via uma rede TCP/IP, e compartilhar dados. É similar a um network pipe) Escreve-se e lê de/para um socket da mesma forma que em um arquivo): ServerSocket, Socket, SocketImpl, SocketInputStream, SocketOutputStream. Exceções: ProtocolException, SocketException, UnknowHostException, UnknowServiceException, MalformedURLException.

65 AWT package Conjunto de classes para implementar o Abstract Windows Toolkit, o qual implementa uma graphical user interface (GUI) neutra relativamente às diversas plataformas. O AWT fornece classes para janelas, botões, listas, menus, layout de objetos em containers, etc...

66 Applet package Conjunto de classes para a criação de applets. Um applet é uma pequena aplicação Java que pode ser “inserida” em uma página WEB e pode ser executada por um browser (ex.: HotJava, Netscape, etc...).

67 Lang Package: a classe Object (i)‏
Object: é a classe base de todas as outras classes em Java. Os métodos da classe object estão presentes em todas as classes. Pode-se, evidentemente, fazer um override destes métodos. Alguns métodos interessantes da classe Object: Cada objeto possui uma representação em String. Pode ser um nome gerado pelo sistema ou, pela classe. P. ex., a representação de um objeto do tipo String é o próprio string. Como obtê-la: Object o = new Object (); System.out.println (“Object = “+ o); // i)‏ System.out.println (“Object = “+ o.toString()); // ii)‏ // i) e ii) são funcionalmente equivalentes.

68 Lang Package: a classe Object (ii)‏
O método toString é automaticamente chamado, quando o objeto faz parte de um println. Deve-se providenciar um override para o método toString caso se deseje uma representação customizada para os objetos de uma dada classe. Isto é feito para a biblioteca de classes de Java. Em Java as classes não possuem um método destructor. Em Java o gerenciamento de memória é automático … Há, todavia o método finalize () imediatamente antes do gc (). Deve-se providenciar um override para este método, no caso de se desejar algumas tarefas específicas tais como: fechar arquivos, desfazer uma conexão, etc… finalize() deve ser usado com cuidado pois não se sabe exatamente quando é realizada a garbage collection.

69 Lang Package: a classe Class
Cada classe em Java possui um descriptor. A classe Class representa este descriptor, ao qual pode-se ter acesso através do método getClass () da classe Object. Não se pode alterar este descriptor, apenas utilizá-lo para se obter informações úteis. P. ex., o método getSuperclass () retorna o descritor de classe da superclasse de uma dada classe. String s = “My name is …”; System.out.println (“String superclass = “ + s.getClass().getSuperclass()); O método getName() retorna o nome da classe. métodos wait (), notify e notifyall () // relacionados com threads...

70 Lang Package: Class String (i)‏
Literais strings são implementados como objetos da classe String. String s1 = “A string”; String s2 = s1 + “with some aditional text”; Como strings são objetos só se pode operar nos mesmos através de métodos apropriados, i.e., não se pode alterá-los após criados. substring(): retorna um string começando em um índice dado. length(): retorna o comprimento do string. System.out.println(s2.substring(s1.length()));

71 Lang Package: Class String (ii)‏
valueOf(): vários métodos (overloaded) que recebem como parâmetro um tipo de dado primitivo e retornam uma representação em string. Este trecho de código faz a variável string s ter o valor “100”. int i = 100; String s = String.valueOf(i); // note que neste exemplo não usamos //uma instância da classe String para invocar o método valueof(). //valueof() é um método de classe ou método estático. Equals(): retorna um booleano indicando se dois objetos string possuem strings internos idênticos. if (s2.equals(s1)) { ... }

72 Lang Package: Class StringBuffer (i)‏
Trata-se de um outro tipo de classe string, mas que pode ser modificada. Em qualquer ponto no tempo, um objeto StringBuffer contém uma seqüência de caracteres particular, mas o comprimento e o conteúdo da seqüência podem ser alterados através da invocação de certos métodos. Um StringBuffer tem uma capacidade. Enquanto ela não for excedida não será necessário criar um novo buffer (array) interno. StringBuffers podem ser usados por múltiplos threads. Os métodos são sincronizados, quando necessário, de modo a preservar a consistência do StringBuffer.

73 Lang Package: Class StringBuffer (ii)‏
Exemplo de uso do método append (): ... String s2 = “A new type of string” StringBuffer sb = new StringBuffer (s2); sb.append (‘.’); System.out.println (sb);

74 Lang Package: Type Wrapper Classes (i)‏
Boolean Character Double Float Integer Long Number Tipos de Dados Primitivos boolean char double float integer long Superclass que define métodos para os type wrappers numéricos

75 Lang Package: Type Wrapper Classes (ii)‏
Para criar instâncias da classe Integer: Integer I1= new Integer(6); Integer I2 = new Integer(“8”); Para converter um valor interno para um novo tipo de dados: double db = I2.doubleValue(); Existem uma série de métodos estáticos para realizar operações em tipos de dados primitivos (sem criar uma instância de uma classe). int i = Integer.parseInt(“7”); Se o string não puder ser convertido para um número, um objeto NumberFormatException é lançado (thrown). Existem variáveis públicas que dão informações sobre os limites superior e inferior para os diversos tipos de dados.

76 Lang Package: Type Wrapper Classes (iii)‏
Exemplo de uso de classes Type Wrapper MichaelCDaconta/Javasrc/SRC4-1.java Mostra: i) como converter strings em números via os métodos valueOf() ou parseInt(); ii) Como converter tipos de dados primitivos em objetos, para uso em outras classes Java (ex., a class Vector). Isto é essencial quando se usa classes containers (util package).

77 Lang Package: System Information (i)‏
Categoria de classes que provêem informações sobre o sistema operacional e acesso a alguns serviços do sistema operacional. System: provê um método independente dos sistema, para se ter acesso à funcionalidade e informações do sistema. (ver o exemplo: MichaelCDaconta/Javasrc/SRC4-5.java)‏ Process: classe instanciada a partir de uma chamada ao método exec() da classe Runtime. A chamada a exec() é muito comum em sistemas UNIX, aonde é usada para originar um novo processo. A classe Process provê métodos para obter o stdin e stdout do processo, matar (kill) o processo e obter o exit value se o processo terminou.

78 Lang Package: System Information (ii)‏
Runtime: é uma classe adjunta a System. (exemplo: MichaelCDaconta/Javasrc/SRC4-6.java)‏ SecurityManager: é uma classe abstrata que possibilita que uma política de segurança seja criada e tornada obrigatória em seu código JAVA. Possui métodos que permitem checks ao ClassLoader, à criação de arquivos, o acesso de applets a packages, etc... ClassLoader: classe abstrata que pode ser estendida para permitir a carga de classes ou de um arquivo ou, da rede. Este mecanismo permitirá uma verdadeira distribuição dinâmica de objetos para qualquer máquina na rede, que disponha de um JAVA run time.

79 Lang Package: classe Math
Disponibiliza uma série de funções matemáticas (exemplo: MichaelCDaconta/Javasrc/SRC4-7.java)‏

80 Lang Package: classes Thread
As classes Threads implementam múltiplos contextos de execução baseados em prioridades, em um único programa. Thread: Deve-se criar uma subclasse desta classe para se produzir um thread. Deve-se fazer o override do método run() da classe Thread com o código que se deseja ser executado. ThreadGroup: Permite que se agrupe threads para melhor manipulá-los. Pode-se, p. ex, alterar as prioridades de todos os threads de um mesmo grupo... (exemplo: MichaelCDaconta/Javasrc/SRC4-8.java)‏

81 Exception Handling (i)‏
Um dos grandes desafios para os programadores sempre foi o de como manipular erros em tempo de execução de modo elegante e eficiente. Na programação tradicional usava-se o comando return para se passar um código indicando erro ou sucesso. O código ficava sobrecarregado com uma série de if ...else em torno de cada chamada à função. Freqüentemente os programadores ignoravam o código de retorno e omitiam o código necessário ao tratamento dos erros, levando o programa a terminar de maneira abrupta e inesperada. A causa dos erros não se tornava logo visível.

82 Exception Handling em JAVA (ii)‏
Um exception handler é freqüentemente chamado de um bloco try-catch. No bloco try encontra-se o código a ser executado e que corresponde ao curso de ação normal. Se ocorrer um erro, Java ou o método chamado podem gerar um objeto (exception object) para indicar o problema. O exception object é passado ao run-time system em busca de um modo para tratar (handle) o erro. O ato de passar o exception object para o run-time system é chamado throwing an exception.

83 Exception Handling em JAVA (iii)‏
Exceções são , de algum modo, similares a eventos. Java pára a execução no local em que ocorreu a exceção. O exception object é então criado e lançado (thrown) pela correspondente sessão de código. Como com eventos, a exceção deve ter algum trecho do código apto a tratá-la. Esta sessão do código que recebe o exception object captura (catch) a exceção. Um exception handler possui um bloco opcional colocado ao final do bloco try-catch chamado finally block. O finally block provê um código para ser executado independente da ocorrência ou não da exceção.

84 Exception Handling em JAVA (iv)‏
Exceptions são representadas por objetos que são instâncias da classe java.lang.Exception. Várias subclasses de Exception fornecem informação especializada (e eventualmente comportamento) para diferentes tipos de problemas. Um comando try pode possuir várias cláusulas catch para especificar diferentes tipos de exceções. Ex.: try { readFromFile(“foo”); ...} catch (FileNotFoundException e) {...} // handle file not found catch (IOException e) { ...} // handle read exception catch (Exception e) {...} // handle all other exceptions

85 Exception Handling em JAVA (v)‏
O programador pode lançar (thrown) suas próprias exceções em Java: uma instância da classe Exception, ou de uma de suas pré- definidas subclasses, ou ainda criar suas próprias subclasses mais especializadas (todas são subclasses da classe Throwable). À keyword thrown segue-se a alocação de um objeto (Exception) do heap. O construtor de Exception aceita um objeto String, que poderá conter uma descrição resumida do problema. O método Exception.printStackTrace identifica aonde a exception foi lançada (thrown), seguindo-se aonde o método X causador da exception foi chamado, o método que chamou X e assim por diante... As exceptions são propagadas ...

86 Exception Handling em JAVA (vi)‏
Exemplos: i) JavaNow/Chap09/ComplexNumbers.java JavaNow/Chap09/Myclass.java ii) JavaNow/Chap09/BankAccount/InsufficientFundsException.java JavaNow/Chap09/BankAccount/BankAccount.java JavaNow/Chap09/BankAccount/test.java

87 Java Exceptions Exception (super classe)‏ InterruptedException
ClassNotFoundException NoSuchMethodException RuntimeException (JVM)‏ ArithmeticException ClassCastException ArrayStoreException NullPointerException NegativeArraySizeException IllegalArgumentException IllegalThreadStateException NumberFormatException (capturar sempre)‏ IndexOutOfBoundsException ArrayIndexOutOfBoundsException StringIndexOutOfBoundsException Security Exception

88 Exception Handling em JAVA (vii)‏
Ver a relação de exceções em: Exploring Java, Patrick Nyemeier e Joshua Peck, cap.IV, pg 96, fig 4.1

89 Lang Package: Run Time Errors
Uma série de classes extende a classe Error, que por sua vez extende a classe Throwable, e os objetos correspondentes são lançados (thrown) pelo Java run time quando ocorre uma condição anormal. Em geral não precisam ser tratadas pelo seu programa. ThreadDeath: é lançada quando o método thread.stop() é invocado. (Não deve ser capturada). VirtualMachineError: sinaliza que a MVJ esgotou os seus recursos ou um erro interni irrecuperavel. StackOverflowError: indica que o stack da MVJ sofreu overflow. (exemplo: MichaelCDaconta/Javasrc/SRC4-9.java)‏

90 Lang Package: Run Time Errors (i)‏
OutOfMemoryError: extende VirtualMachineError. Indica que a MVJ não pode atender a um pedido de memória. (exemplo: MichaelCDaconta/Javasrc/SRC4-10.java)‏ UnknownError: extende VirtualMachineError. A princípio nunca deveria ocorrer. LinkageError: estende Erro. Indica que uma classe é dependente de uma outra classe. Todavia, esta última alterou-se de forma incompatível, depois da compilação da primeira classe (ver explicações na pág. 168 do livro do Daconta). NoClassDefFoundError: Estende LinkageError. A MVJ não consegue encontrar uma classe (isto pode ocorrer se a classe existia em tempo de compilação, porém, depois, foi removida).

91 Lang Package: Run Time Errors (ii)‏
ClassCircularityError: estende LinkageError. Uma circularidade foi detectada durante a inicialização da classe (A -->B -->A). ClassFormatError: estende LinkageError. Indica a detecção de um formato de arquivo inválido, no momento em tentava carregar uma classe. VerifiyError: estende LinkageError. Ocorreu uma verificação ao se tentar carregar uma classe. UnsatisfiedLinkError: estende LinkageError. Esta classe é lançada se um método nativo foi declarado nativ, mas o run time não pode encontrar a dynamic library para linkar, ou houve o link porém o método não faz parte daquela library.

92 Lang Package: Run Time Errors (iii)‏
IncompatibleClassChangeError NoSuchMethodError NoSuchFieldError AbstractMethodError IllegalAccessError InstantiationError

93 Interface Conjunto de métodos que especificam o protocolo (comportamento) que uma ou mais classes devem implementar. O conceito de Interface é utilizado em JAVA para implementar características típicas de Herança Múltipla.

94 Util Package: Containers (i)‏
Conjunto de classes para armazenamento e recuperação efeciente de outros objetos. Todos os containers podem armazenar qualquer objeto JAVA. Os objetos armazenados não precisam ser todos homogêneos. Pode-se usar run time type information para determinar o tipo on the fly. Dictionary: Classe abstrata que descreve um conjunto associativo (associa chaves a valores). Super classe de HashTable. HashTable: classe para acesso randômico que usa uma função hash ( o método HashCode()). Há a possibilidade de colisões (exemplo: MichaelCDaconta/Javasrc/SRC4-17.java)‏

95 Util Package: Containers (ii)‏
Properties: extende HashTable. Cria objetos HashTable persistentes que podem ser salvos em um stream e, carregados de um stream. Vector: Arrays que podem crescer, i.e., a dimensão não é fixa. (exemplo: MichaelCDaconta/Javasrc/SRC1-7.java)‏ Enumeration: Interface que descreve o protocolo para percorrer os elementos de um conjunto. Possui dois métodos: hasMoreElements() e nextElement(). VectorEnumerator: Classe final (não pode ser extendida) que implementa a interface Enumeration. Stack: Extende Vector. Implementa o conceito de pilhas (exemplo: MichaelCDaconta/Javasrc/SRC4-16.java)‏

96 Util Package: Containers (iii)‏
Observer: Uma interface que possibilita à classe ser observada por uma instância da classe Observer. Observable: Uma representação de um objeto ou dados que estejam sendo observados por um conjunto de observers. Se o objeto é alterado todos os observers são notificados pela invocação aos respectivos métodos update() (update() é parte da interface Observer). BitSet: Conjunto dinâmico de bits (pode crescer). Operações possíveis: setar , limpar , ler, AND, OR, XOR.

97 Util Package: outras classes utilitárias
Math: funções matemáticas (exemplo: MichaelCDaconta/Javasrc/SRC4-7.java)‏ Date: date e time (exemplo: MichaelCDaconta/Javasrc/SRC4-17.java)‏ Random: classe para geração de números pseudo-aleatórios (exemplo: MichaelCDaconta/Javasrc/SRC4-8.java)‏ StringTokenizer: Implementa a interface Enumeration. Separa uma cadeia de caracteres (string) em seus elementos constituintes (tokens). Muito útil em parses (exemplo: MichaelCDaconta/Javasrc/SRC4-17.java)‏

98 IO em Java Segue um modelo semelhante ao de C e C++.
Não existe primitivas em Java para operações de IO. As operações de IO são realizadas por classes do package java.IO. A classe java.Lang.System provê uma interface system-independent para certas funções gerais. Objeto Tipo Propósito System.in BufferedInputStream entrada padrão (keyboard)‏ System.out PrintStream saída padrão (display)‏ System.err PrintStream erro padrão (display)‏ As operações de IO em Java baseiam-se no conceito de Stream. IO pode não estar disponível em applets, por questão de segurança.

99 IO Package: File class (i)
Encapsula o acesso a informação sobre arquivos ou diretórios no filesystem. Obtém informações sobre atributos dos arquivos Lista os arquivos de um diretório Remove arquivos Cria diretórios ... Todavia, não lê nem escreve em arquivos. Estas operações são realizadas por classes do tipo stream. O filesystem encontra-se fora da JVM e, portanto é suscetível a diferenças oriundas de arquitetura ou implementações (ex.: file separator = “/” em UNIX e = “\” em WINDOWS). Exemplo: ExploringJava/io/ListIt.java

100 IO Package: File class (ii)
public class java.io.File extends java.lang.Object { // Fields public final static String pathSeparator; public final static char pathSeparatorChar; public final static String separator; public final static char separatorChar; // Constructors public File(File dir, String name); public File(String path); public File(String path, String name); // Methods public boolean canRead(); public boolean canWrite(); public boolean delete();

101 IO Package: File class (iii)
public class java.io.File extends java.lang.Object { //Methods ... public boolean equals(Object obj); public boolean exists(); public String getAbsolutePath(); public String getName(); public String getParent(); public String getPath(); public int hashCode(); public boolean isAbsolute(); public boolean isDirectory();

102 IO Package: File class (iv)
public class java.io.File extends java.lang.Object { //Methods ... public boolean isFile(); public long lastModified(); public long length(); public String[] list(); public String[] list(FilenameFilter filter); public boolean mkdir(); public boolean mkdirs(); public boolean renameTo(File dest); public String toString(); }

103 ... ... ... FileInput- Stream InputStream FilterInput- DataInput-
java.lang.Object DataOutput- Stream Random- AccessFile FilterOutput- Stream ... PrintStream Output- Stream FileOutput- Stream

104 ByteArray- InputStream Buffered- InputStream FileInput- Stream DataInput- Stream Filter- InputStream InputStream Piped- InputStream LineNumber- InputStream Sequence- InputStream Pushback- InputStream StringBuffer- InputStream

105 FileOutput- Stream DataOutput- Stream
ByteArray- OutputStream Buffered- OutputStream FileOutput- Stream DataOutput- Stream Filter- OutputStream OutputStream PrintStream Piped- OutputStream

106 IO Package Streams: representam um fluxo de dados ou um canal de comunicação, em que se escreve de um lado e se lê do outro. InputStream/OutputStream: classes abstratas que definem a funcionalidade mínima necessária para se ler ou escrever em uma seqüência não estruturada de bytes. Todos os outros tipos de streams em Java são descendentes de InputStream/OutputStream. FileInputStream/FileOutputStream: classes com operações básicas de input e output: ler um byte ou um array de bytes; saltar alguns bytes e fechar (close) o stream. (exemplo: JavaByExampleBook/applications/IO/CopyFile.java)‏

107 IO Package: InputStream (i)‏
public abstract class java.io.InputStream extends java.lang.Object { // Constructors public InputStream(); // Methods public int available(); public void close(); public void mark(int readlimit); public boolean markSupported(); public abstract int read(); public int read(byte b[]); public int read(byte b[], int off, int len); public void reset(); public long skip(long n); }

108 IO Package: InputStream (ii)‏
InputStream(): Construtor padrão. Avaiable(): Modo não-bloqueado de sabermos o número de bytes disponíveis para leitura. Close(): fecha o input stream. Mark(): Assinala a posição corrente do stream. Read()‏ read(byte b[])‏ read(byte b[], int off, int len) reset (): reset o stream na última posição assinalada (marked). Skip (): salta o número especificado de bytes.

109 IO Package: InputStream (ii)‏
public abstract int read() throws IOException Reads the next byte of data from this input stream. The value byte is returned as an int in the range 0 to 255. If no byte is available because the end of the stream has been reached, the value -1 is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown. A subclass must provide an implementation of this method. Returns: the next byte of data, or -1 if the end of the stream is reached. Throws: IOException If an I/O error occurs.

110 IO Package: InputStream (iii)‏
public int read(byte b[]) throws IOException Reads up to b.length bytes of data from this input instream into an array of bytes. The read method of InputStream calls the the read method of three arguments with the arguments b, 0, and b.length. Parameters: “b”: the buffer into which the data is read Returns: the total number of bytes read into the buffer, or -1 is there is no more data because the end of the stream has been reached. Throws: IOException If an I/O error occurs.

111 IO Package: InputStream (iv)‏
public int read(byte b[], int off, int len) throws IOException Reads up to len bytes of data from this input stream into an array of bytes. This method blocks until some input is available. If the first argument is null, up to len bytes are read and discarded. The read method of InputStream reads a single byte at a time using the read method of zero arguments to fill in the array. Subclasses are encouraged to provide a more efficient implementation of this method. Parameters: b- the buffer into which the data is read off- the start offset of the data len- the maximum number of bytes read Returns: the total number of bytes read into the buffer, or -1 is there is no more data because the end of the stream has been reached. Throws: IOException If an I/O error occurs.

112 IO Package: FileInputStream (i)‏
public class java.io.FileInputStream extends java.io.InputStream { // Constructors public FileInputStream(File file); public FileInputStream(FileDescriptor fdObj); public FileInputStream(String name); // Methods public int available(); public void close(); protected void finalize(); public final FileDescriptor getFD(); public int read(); // Os métodos read são herdados de InputStream public int read(byte b[]); public int read(byte b[], int off, int len); public long skip(long n); }

113 IO Package: ByteArrayInputStream/...Output...(i)
ByteArrayInputStream/...Output...: implementa um buffer (array de bytes que pode ser usado como um inputstream/...output... Embora o array de bytes localize-se na memória, esta classe stream permite o acesso ao mesmo via read calls. Os bytes lidos são supridos pelo conteúdo do array de bytes. As aplicações também podem ler bytes de um string via o uso da classe StringBufferInputStream. Muito útil para a leitura de objetos persistentes.

114 IO Package: ByteArrayInputStream/...Output...(ii)
public class java.io.ByteArrayInputStream extends java.io.InputStream { // Fields protected byte buf[]; protected int count; protected int pos; // Constructors public ByteArrayInputStream(byte buf[]); public ByteArrayInputStream(byte buf[], int offset, int length); // Methods public synchronized int available(); public synchronized int read(); public synchronized int read(byte b[], int off, int len); public synchronized void reset(); public synchronized long skip(long n); }

115 IO Package: StringBufferInputStream (i)‏
Implementa um StringBuffer (string modificável) que pode ser usado como um InputStream. É similar à classe ByteArrayInputStream, no sentido de que permite obter dados serialmente de um StringBuffer através de read() calls. Apenas os oito bits de mais baixa ordem de cada caracter no string são usados por esta classe. Exemplo: JustJava/examples/ch7/io/test7a.java

116 IO Package: StringBufferInputStream (ii)‏
public class java.io.StringBufferInputStream extends java.io.InputStream { // Fields protected String buffer; protected int count; protected int pos; // Constructors public StringBufferInputStream(String s); // Methods public synchronized int available(); public synchronized int read(); public synchronized int read(byte b[], int off, int len); public synchronized void reset(); public synchronized long skip(long n); }

117 IO Package: SequenceInputStream (i)‏
Dada uma série de InputStreams, efetivamente concatena-os, possibilitando ao programador o acesso aos mesmos como se constituissem um único (e maior) stream . Cada InputStream é lido até o final. Então a classe SequenceInputStream fecha (close) o stream e automaticamente inicia a leitura do novo stream e, assim, sucessivamente. Exemplo: JustJavaBook/examples/ch7/io/test7c.java

118 IO Package: SequenceInputStream (ii)‏
public class java.io.SequenceInputStream extends java.io.InputStream { // Constructors public SequenceInputStream(Enumeration e); public SequenceInputStream(InputStream s1, InputStream s2); // Methods public void close(); public int read(); public int read(byte buf[], int pos, int len); }

119 IO Package: PipedInputStream/PipedOutputStream (i)
Classes usadas aos pares . Possibilitam a comunicação entre dois threads via IO calls. Aquilo que um thread grava em um PipedOutputStream será lido por um outro thread que instanciou um PipedInputStream. Estas duas classes fornecem pronto um consumer-producer buffer. Exemplo: JavaAppsHopson&Ingram/Chap08/PipeApplet.java

120 IO Package: PipedInputStream (ii)‏
public class java.io.PipedInputStream extends java.io.InputStream { // Constructors public PipedInputStream(); public PipedInputStream(PipedOutputStream src); // Methods public void close(); public void connect(PipedOutputStream src); public int read(); public int read(byte b[], int off, int len); }

121 IO Package: PipedOutputStream (ii)‏
public class java.io.PipedOutputStream extends java.io.OutputStream { // Constructors public PipedOutputStream(); public PipedOutputStream(PipedInputStream snk); // Methods public void close(); public void connect(PipedInputStream snk); public void write(byte b[], int off, int len); public void write(int b); }

122 P P i i p p e e A B Consumidor Envia Pedido (Write)‏ Obtém Resultado
(Read)‏ P i p e A P i p e B Produtor Recebe Pedido (Read)‏ Envia Resultado (Write)‏ Serviço Pedido

123 IO Package: FilterInputStream/...Output...
Classe derivada de InputStream. Provê a facilidade de se ter vários níveis de InputStreams encadeados. .Cada um destes níveis modificará os dados que passam por ele de um modo determinado. Na prática FilterInputStream simplesmente faz o override do método read() do InputStream subjacente, primeiramente invocando-o e depois, retornando qualquer valor que assim desejar. Consegue-se, assim, alterar o InputStream inicial. Subclasses de FilterInputStream poderão prover o seu próprio override dos métodos e também adicionar novos métodos e data members. Classes derivadas: BufferedInputStream, DataInputStream, LineNumberInputStream, PushbackInputStream.

124 IO Package: FilterInputStream
public class java.io.FilterInputStream extends java.io.InputStream { // Fields protected InputStream in; // Constructors protected FilterInputStream(InputStream in); // Methods public int available(); public void close(); public void mark(int readlimit); public boolean markSupported(); public int read(); public int read(byte b[]); public int read(byte b[], int off, int len); public void reset(); public long skip(long n); }

125 IO Package: FilterOutputStream
public class java.io.FilterOutputStream extends java.io.OutputStream { // Fields protected OutputStream out; // Constructors public FilterOutputStream(OutputStream out); // Methods public void close(); public void flush(); public void write(byte b[]); public void write(byte b[], int off, int len); public void write(int b); }

126 IO Package: FilterInputStream - Exemplo
ExploringJava/io/rot13InputStream.java

127 IO Package: BufferedInputStream/...Output ....
Na primeira vez em que os dados são lidos retorna-se para o usuário apenas os dados (quantidade de bytes) requisitados no read. Os dados restantes são mantidos em um buffer em memória - 2 kbytes por default, invisível para a aplicação - a fim de atender a novos reads. Só quando o buffer é esgotado é que se lê fisicamente do arquivo ByteArrayInputStream. exemplo: JavaNow/Chap10/FileIO/FileIO.java

128 IO Package: BufferedInputStream
public class java.io.BufferedInputStream extends java.io.FilterInputStream { protected byte buf[]; // Fields protected int count; protected int marklimit; protected int markpos; protected int pos; public BufferedInputStream(InputStream in); // Constructors public BufferedInputStream(InputStream in, int size); public int available(); // Methods public void mark(int readlimit); public boolean markSupported(); public int read(); public int read(byte b[], int off, int len); public void reset(); public long skip(long n); }

129 IO Package: DataInputStream/...Output...
Classe que provê métodos para ler, de um InputStream, os diversos tipos de dados built-in: booleans, floats, integers, etc... Outros métodos lêem uma linha do InputStream , um número determinado de bytes, etc... O método a ser chamado depende do tipo de dado esperado. Os dados nos streams de input e output sempre tomam a forma binária. Assim, p. ex., um inteiro de valor zero corresponderá a 4 bytes de 0x30, que seria o código ASCII para o string impresso “0000”. Exemplo: MichaelCDaconta/Javasrc/SRC4-17.java)‏

130 IO Package: DataInputStream (i)‏
public class java.io.DataInputStream extends java.io.FilterInputStream implements java.io.DataInput { // Constructors public DataInputStream(InputStream in); // Methods public final int read(byte b[]); public final int read(byte b[], int off, int len); public final boolean readBoolean(); public final byte readByte(); public final char readChar(); public final double readDouble(); public final float readFloat(); public final void readFully(byte b[]); public final void readFully(byte b[], int off, int len);

131 IO Package: DataInputStream (ii)‏
public class java.io.DataInputStream extends java.io.FilterInputStream implements java.io.DataInput { ... public final int readInt(); public final String readLine(); public final long readLong(); public final short readShort(); public final int readUnsignedByte(); public final int readUnsignedShort(); public final String readUTF(); public final static String readUTF(DataInput in); public final int skipBytes(int n); }

132 IO Package: LineNumberInputStream (i)‏
Classe para entrada de dados que guarda o registro do número de linhas lidas. Também fornece a possibilidade de se alterar e de se recuperar o contador de linhas (line count). O contador de linha é inicializado com zero. Uma linha é uma seqüência de bytes terminando com: i) um carriage return (‘\r’); ii) um caracter de newline (‘\n’); iii) um carriage return imediatamente seguido por um caracter de linefeed. Em todos os três casos o caracter indicativo do final da linha será retornado como um único caracter. Usualmente utilizada acoplada a outro tipo de stream. Exemplo: JustJavaBook/examples/ch7/io/test7b.java

133 IO Package: LineNumberInputStream (ii)‏
public class java.io.LineNumberInputStream extends java.io.FilterInputStream { // Constructors public LineNumberInputStream(InputStream in); // Methods public int available(); public int getLineNumber(); public void mark(int readlimit); public int read(); public int read(byte b[], int off, int len); public void reset(); public void setLineNumber(int lineNumber); public long skip(long n); }

134 IO Package: PushbackInputStream (i)‏
Esta classe fornece um método para colocar de volta (“push back”) no input stream, um byte que tenha sido lido. Esta é uma operação comum quando na fase de análise léxica dos compiladores. Permite que se olhe um byte à frente e, então, se decida o que fazer com o token corrente, em função do contexto.

135 IO Package: PushbackInputStream (ii)‏
public class java.io.PushbackInputStream extends java.io.FilterInputStream { // Fields protected int pushBack; // Constructors public PushbackInputStream(InputStream in); // Methods public int available(); public boolean markSupported(); public int read(); public int read(byte bytes[], int offset, int length); public void unread(int ch); }

136 IO Package: PrintStream (i)‏
Esta classe implementa alguns métodos adicionais que transformam os seus argumentos em strings, colocando-os no output stream. Possui ainda, um conjunto complementar de métodos println() que adicionam um caracter de newline ao final do string. Os streams System.out e System.err são instâncias da classe PrintStream. PrintStream faz o override de vários métodos de InputStream, de modo a não lançar uma exceção de IO. O que causaria uma exceção de IO ativa um flag a que a aplicação pode ter acesso invocando o método checkError. Ex: JavaByExampleBook/Applications/Io/TokenizerText.java

137 IO Package: PrintStream (ii)‏
public class java.io.PrintStream extends java.io.FilterOutputStream { // Constructors public PrintStream(OutputStream out); public PrintStream(OutputStream out, boolean autoflush); // Methods public boolean checkError(); public void close(); public void flush(); public void print(char c); // idem para os tipos primitivos int, long, etc... public void print(char s[]); public void print(Object obj); public void print(String s); public void println(); public void println(char c); // idem para os tipos primitivos int, long ... //métodos idênticos a print(...), só que acrescentando newline. public void write(byte b[], int off, int len); public void write(int b); }

138 IO Package: StreamTokenizer (i)‏
Classe que possibilita uma análise léxica básica de um input stream. O input stream é particionado em seus tokens constituintes, os quais podem ser lidos um de cada vez. O processo de parsing é controlado por uma tabela e um número de flags que podem ser ativadas em vários estados. StreamTokenizer pode reconhecer identificadores, números, strings com aspas, e vários estilos de comentários. Uma aplicação típica inicialmente contrói uma instância da classe StreamTokenizer, inicializa as tabelas de sintaxe, e então executa um loop invocando repetidamente o método nextToken() em cada iteração até que seja retornado o valor TT_EOF. Ex: JavaByExampleBook/Applications/Io/TokenizerText.java

139 IO Package: StreamTokenizer (ii)‏
public class java.io.StreamTokenizer extends java.lang.Object { // Fields public double nval; public String sval; public int ttype; // possible values for the ttype field public final static int TT_EOF; public final static int TT_EOL; public final static int TT_NUMBER; public final static int TT_WORD; // Constructors public StreamTokenizer(InputStream I); // Methods public void commentChar(int ch); public void eolIsSignificant(boolean flag); ...

140 IO Package: StreamTokenizer (iii)‏
public class java.io.StreamTokenizer extends java.lang.Object { public int lineno(); public void lowerCaseMode(boolean fl); public int nextToken(); public void ordinaryChar(int ch); public void ordinaryChars(int low, int hi); public void parseNumbers(); public void pushBack(); public void quoteChar(int ch); public void resetSyntax(); public void whitespaceChars(int low, int hi); public void slashStarComments(boolean flag); public String toString(); public void whitespaceChars(int low, int hi); public void wordChars(int low, int hi); }

141 IO Package: RandomAccessFile (i)‏
Esta classe permite que se mova o ponteiro do arquivo para uma posição arbitrária no arquivo, antes de se ler ou gravar no mesmo. Permite o acesso randômico ao arquivo. Ao se abrir o arquivo deve-se fornecer um string indicativo do modo de acesso ao arquivo: read access only - “r “read and update access - “rw” Exemplo: JustJavaBook/examples/ch7/io/test7e.java

142 IO Package: RandomAccessFile (ii)‏
public class java.io.RandomAccessFile extends java.lang.Object implements java.io.DataOutput java.io.DataInput { // Constructors public RandomAccessFile(File file, String mode); public RandomAccessFile(String name, String mode); // Methods public void close(); public final FileDescriptor getFD(); public long getFilePointer(); public long length(); public int read(); public int read(byte b[]); public int read(byte b[], int off, int len); public final boolean readBoolean(); public final byte readByte(); public final char readChar(); ...

143 IO Package: RandomAccessFile (iii)‏
public class java.io.RandomAccessFile extends java.lang.Object implements java.io.DataOutput java.io.DataInput { ... public final double readDouble(); public final float readFloat(); public final void readFully(byte b[]); public final void readFully(byte b[], int off, int len); public final int readInt(); public final String readLine(); public final long readLong(); public final short readShort(); public final int readUnsignedByte(); public final int readUnsignedShort(); public final String readUTF(); public void seek(long pos); public int skipBytes(int n); public void write(byte b[]); ...

144 IO Package: RandomAccessFile (iv)‏
public class java.io.RandomAccessFile extends java.lang.Object implements java.io.DataOutput java.io.DataInput { ... public void write(byte b[], int off, int len); public void write(int b); public final void writeBoolean(boolean v); public final void writeByte(int v); public final void writeBytes(String s); public final void writeChar(int v); public final void writeChars(String s); public final void writeDouble(double v); public final void writeFloat(float v); public final void writeInt(int v); public final void writeLong(long v); public final void writeShort(int v); public final void writeUTF(String str); }

145 Abstract Window Toolkit
Interface independente de plataforma que permite o desenvolvimento de uma GUI que pode ser executada na maior parte das plataformas existentes. Em todos os produtos cross-plataform o desenvolvedor deve escolher entre as seguintes estratégias: mesma aparência (common look and feel) entre diferentes plataformas (Common Desktop Environment)‏ funcionalidade comum, com aparência específica para cada plataforma O awt adota abordagem common functionality/specific implementation. .

146 Abstract Window Toolkit
Três conceitos são utilizados em JAVA AWT para implementar a “funcionalidade comum / aparência específica” da plataforma: objetos abstratos toolkits peers Todos elementos de GUI suportados pelo AWT possuem uma classe. Os objetos GUI do AWT são abstrações de uma GUI independentes da plataforma (objetos abstratos). O toolkit é uma implementação, para cada plataforma específica, de todos os elementos GUI suportados pelo AWT. Cada toolkit implementa os elementos GUI específicos para cada plataforma, através da criação de um GUI peer.

147 Abstract Window Toolkit
Como ter acesso ao toolkit default e imprimir propriedades específicas da plataforma do toolkit e do hardware. Java for C/C++ Programmers. Michael C. Daconta. John Wiley & Sons, Inc. Pág SRC6-1.java Código que ilustra a criação em separado de um objeto AWT do seu peer. Java for C/C++ Programmers. Michael C. Daconta. John Wiley & Sons, Inc. Pág SRC6-2.java Deve-se ressaltar que: peers são separados dos objetos AWT (são implementados usando a idéia de containment e, não, herança. O peer não é criado até o momento em que existe uma representação física do screen (no exemplo, o método show do objeto myFrame, que é uma instância da classe Frame).

148 Principais Elementos do AWT (I)‏
Components: O elemento fundamental de toda GUI. É implementado via uma classe abstrata Component, a qual possui subclasses para implementar componentes específicos. Events: Ação do usuário que é trazuzida em uma estrutura de dados Event (armazena o tipo da ação, quando ela ocorreu, etc...) e enviada para o interpretador JAVA pelo sistema operacional. Events são enviados para serem tratados pelo componente GUI a que pertencem. Manipula-se eventos em JAVA fazendo-se o “override”do método handleEvent ou de um dos métodos específicos para tratamento de eventos na classe Component.

149 Principais Elementos do AWT (II)‏
Containers: São componentes que armazenam outros componentes. Layout: Trata-se de uma metodologia para dispor components em um container. Um layout determina aonde os components serão desenhados. Painting e Updating: Java provê os métodos paint(), repaint() e update() para customizar os desenhos de sua aplicação.

150 Choice Button Label Component Canvas List Checkbox Text Component Container MenuComponent TextField TextArea Window Panel MenuIten MenuBar Frame Dialog Applet Menu FileDialog

151 Components (i) São os objetos que automaticamente nos vêm a mente quando pensamos em uma GUI.
Canvas: Representa uma área retangular do vídeo, na qual a aplicação pode desenhar algo, ou da qual a aplicação possa capturar input events gerados pelo usuário. A aplicação deve criar uma subclasse da classe Canvas, de modo a conseguir algum nível útil de funcionalidade. Deve-se fazer um override do método paint de forma a se desenhar gráficos customizados no canvas. O AWT envia ao canvas todos os eventos de mouse, keyboard e focus que ocorrem no mesmo. (Deve-se fazer um override dos métodos gotFocus, lostFocus, keyDown, keyUp, mouseEnter, mouseExit, mouseMove, mouseDrag, mouseDown e mouseUp, de modo a se capturar os eventos do usuário.

152 Components (ii)‏ Containers:
São components que armazenam outros components e os dispõem segundo um Layout manager. A representação em vídeo de um container é um retângulo. Portanto os components são dispostos dentro do retângulo. Existem dois tipos de components: windows e panels. Uma window é o elo entre a sua aplicação e o mundo exterior. Através dela o usuário comunica-se com a aplicação. Um panel é uma seção de uma window. Os panels possibilitam que uma window seja subdividida em subseções, cada qual com o seu próprio Layout manager.

153 Components (iii)‏ Containers:
Um Applet é um panel que é apresentado dentro de uma janela (window) de um browse. Existem vários tipos de windows, cada uma com um propósito diferente: Window: uma window de mais alto nível que não possui bordas (borders) e nem barra de menu (menu bar). Ideal para implementar menus pop-up. Frame: window de mais alto nível que possui bordas e que pode ter uma barra de menu. A barra pode ter um título para o frame. Dialog: trata-se de uma window com uma borda que é normalmente uma subwindow em uma aplicação e que é usada para se obter input do usuário. Existem os modal dialog (obrigatório o fornecimento da informação) e modeless dialog (fazer Modal = false no construtor da classe AWT dialog). File Dialog: diálogo especial usado para abrir e salvar arquivos.

154 Como estruturar components dentro dos containers (i)‏
AWT GUIs devem executar em múltiplas plataformas e sistemas operacionais. Isto causa problemas para o ordenamento das coordenadas dos components, porque estes têm diferentes tamanhos em diferentes sistemas operacionais. A Interface LayoutManager descreve os métodos que uma classe deve implementar de modo a ordenar (layout) um container. Por laying out a container quer-se dizer uma classe que usa uma metodologia específica para dispor componentes dentro de um retângulo de um container (especificado por sua dimensão - Dimension). Todo container deve possuir um LayoutManager. O Layout manager default é o BorderLayout.

155 Como estruturar components dentro dos containers (ii)‏
Métodos dos containers que são específicos para dispor os (laying out) components: public setLayout(LayoutManager mgr): associa a classe LayoutManager ao component. Existe um conjunto pré-definido de LayoutManagers que podem ser associados. Pode-se associar o LayoutManager a null e customizar-se a apresentação dos components no container usando-se o método reshape () na classe component. Isto não é recomendável porque a sua GUI provavelmente só estará correta para o seu sistema. Em outras plataformas ....!?

156 Como estruturar components dentro dos containers (iii)‏
public LayoutManager getLayout(): retorna o LayoutManager corrente. public synchronized Component add(String name, Component comp): Este método adiciona um component tanto ao container quanto ao LayoutManager. Public synchronized Component add(Component comp): adiciona um component apenas ao container, e não, ao Layout manager. Os components não serão mostrados se adicionados deste modo, a menos que se chame explicitamente reshape() para cada component.

157 Layout Managers pré-definidos para o AWT (classes pré-definidas no AWT e que implementam a interface LayoutManager)‏ BorderLayout: Layout que representa uma conjunto de components que envolvem um component central. É implementado admitindo apenas 5 (cinco) components identificados por “North”, “South”, “East”, “West” e “Center”. Pode-se especificar gaps horizontais e verticais entre os components. FlowLayout: Layout que representa components dispostos linearmente.. É implementado dispondo-se os components ao longo de uma linha, da esquerda para a direita. GridLayout: Layout que representa uma grade simples com apenas um component por célula. É implementado especificando-se o número de linhas e colunas da grade. Todas as células são do mesmo tamanho. Os components são adicionados às células preenchendo-se, primeiro, as linhas.

158 Layout Managers pré-definidos para o AWT (classes pré-definidas no AWT e que implementam a interface LayoutManager)‏ GridBagLayout: Layout que representa uma grade muito flexível. É implementado via uma grade retangular de células, em que um component pode ser colocado em qualquer célula, podendo ocupar mais de uma célula. Especifica-se o local de um component alterando-se as variáveis gridx e gridy das restrições (constraints) de cada component. As variáveis gridheight e gridwidth especificam a largura e a altura de uma subgrade dentro da grade. Uma vez determinada a área em que um component será mostrado, pode-se especificar aonde, nesta área ele deverá ser ancorado, no caso da área ser maior que o component. Ver os programas SRC6-7.java e SRC6-8.java, Pág. 319 e 328 do livro: Java for C/C++ Programmers. Michael C. Daconta. John Wiley & Sons, Inc.

159 Graphics Context (i)‏ Todos os sistemas GUI têm o conceito de estrutura de dados gráfica, para armazenar informações específicas de contexto sobre uma área de desenho. Esta área pode ser todo o screen, parte do screen (como um único component), ou ainda uma impressora. Pode-se, assim, subdividir o monitor físico em um número arbitrário de áreas de desenho. Cada contexto gráfico (e portanto, cada área de desenho) pode possuir um conjunto diferente de características gráficas (background color, default font, line size, etc ...). MS Windows --- Device Context (DC)‏ X Windows --- Graphics Context (GC)‏ Macintosh --- GrafPort Java --- classe abstrata Graphic

160 Graphics Context (ii)‏
Os contextos gráficos possibilitam que o desenho ocorra de modo genérico, sem especificar-se aonde o mesmo ocorrerá. Isto o torna independente do dispositivo. O graphic context é instanciado quando o método show() é invocado (similar à instanciação do toolkit e peer). É específico para cada plataforma. Ver o programa SRC6-9.java, Pág. 332 do livro: Java for C/C++ Programmers. Michael C. Daconta. John Wiley & Sons, Inc. É importante registrar-se que, ao desenharmos em contextos gráficos, se uma janela se sobrepõe à janela em que desenhamos, quando a trouxermos novamente para foreground (via click do mouse, p.ex.), os desenhos desaparecerão da janela.

161 Graphics Context (iii)‏
Um método especial paint é a solução para este problema e é automaticamente invocado sempre que o component (no caso, a janela) é exposto, i.e., tornado visível. Em cada component existem três métodos painting críticos: paint(Graphics g): o método paint default de cada component nada faz. É preciso fazer-se o override deste método para desenhar no component. Este método é chamado quando o component é mostrado pela primeira vez - via invocação de show() - e, então, toda vez que a janela é novamente exposta, após ter sido coberta por outra janela. repaint(): Sem argumentos, este método invoca o método update do component tão cedo quanto possível. Pode-se especificar um número de milisegundos para se invocar update(). update(Graphics g): O método default limpa o component preenchendo-o com a cor de background, fixa a cor do graphic context como a cor de foreground e, então, invoca o método paint() [origem do animation flicker].

162 Threads Fluxo de controle

163 Package java.lang: Thread Class (i)‏
Um thread é um fluxo sequencial de execução. Similar ao conceito de processo. Cada processo possui o seu próprio address space. Já os threads compartilham um mesmo address space. Um processo pode conter um ou mais threads, em um ambiente operacional que suporte multithreading. Como os threads compartilham o mesmo address space irão compartilhar as mesmas instance variables, mas não as variáveis locais. Um thread pode criar outros threads. Em Java vários threads estão presentes (Ex. Garbage Colector, paint(), etc...).

164 Package java.lang: Thread Class (ii)‏
Em Java há duas alternativas para se criar um novo thread: estendendo-se a classe java.lang.Thread e fazendo-se o override do método run(). Implementando-se a Runnable Interface. Neste caso, deve-se definir o método run(). Todo Thread em Java inicia a sua existência via a execução de um método run(). run() deve ser public; não pode retornar um valor; não pode lançar (thrown) qualquer exceção.

165 java.lang.Thread extensions
class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // computa números primos maiores que minPrime } } // O código a seguir criaria um thread e iniciaria a sua execução ... PrimeThread p = new PrimeThread(143); p.start();

166 Runnable Interface class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; } public void run() { // computa números primos maiores que minPrime } } // O código a seguir instancia uma classe que implementa a Runnable Interface e cria um novo Thread passando-a como parâmetro. Inicia-se, então, o novo Thread. PrimeRun p = new PrimeRun(143); new Thread(p).start();

167 Runnable Interface - código alternativo
class PrimeRun implements Runnable { Thread MyThread; long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; MyThread = new Thread (this); MyThread.Start(); } public void run() { // computa números primos maiores que minPrime } } // O código a seguir criaria um thread e iniciaria a sua execução PrimeRun p = new PrimeRun(143);

168 Criando Threads - exemplos
JustJavaBook/examples/ch5/thread5a.java (modos alternativos para criar threads)‏ JavaAppsHopson&Ingram/Chap08/LineApplet1/LineApplet.java JavaAppsHopson&Ingram/Chap08/LineApplet2/LineApplet.ver1.java JavaAppsHopson&Ingram/Chap08/ LineApplet3/ LineApplet.ver2.java JavaAppsHopson&Ingram/Chap08/LineApplet4/LineApplet.ver3.java

169 Package java.lang: Thread Class (iii)‏
Um novo Thread é criado instanciando-se a classe java.lang.Thread O objeto Thread representa um thread para o interpretador Java e serve como um handle para controlar e sincronizar a sua execução. Java é uma linguagem sem herança múltipla. Uma classe derivada de Thread não poderia, p. ex., rodar a classe Applet como um Thread. Assim, Java também implementa threads via a interface Runnable. A sua classe deve, pois, implementar Runnable e deve definir um método run(). Após, instancia-se um Thread e passa-se a classe que implementa a Runnable Interface como parâmetro.

170 Métodos para controlar os Threads (i)‏
start() dá início à execução do Thread. run() contém o código a ser executado no Thread. stop() acaba com o Thread. suspend() suspende (bloqueia) a execução do Thread. resume() reinicia a execução do Thread (que anteriormente invocou um suspend()). suspend() e resume() devem ser usados em situações em que o processo de setup do Thread seja muito dispendioso (abertura de sockets e comunicações mais elaboradas, p. ex.). sleep() método estático que causa um delay na execução do Thread corrente de um número específico de milisegundos.

171 Métodos para controlar os Threads (ii)‏
Thread.sleep() lança (throwns) uma InterruptedException se interrompido por um outro Thread. join() faz com que o thread que ativou o presente thread espere até que este último realmente esteja morto. É sempre muito perigoso não se esperar pela morte de um thread. O thread pode ativar certos objetos (ex. um applet) que não mais sejam válidos. Isto pode causar uma exceção ou travar um applet. Existem versões adicionais de join() que só esperarão por t milisegundos (time-out value).

172 Sincronização (i)‏ Mecanismo para sincronizar as atividades de vários threads. As classes, em java, devem ser threads-safe, i.e., vários threads devem, a princípio, utilizar concorrentemente/simultâneamente a mesma classe. Há trechos de código, as regiões críticas, que não podem ser executadas concorrentemente/simultâneamente. Deve-se sincronizar o acesso a estes trechos de código.

173 Regiões críticas - exemplos (i)‏

174 Regiões críticas - exemplos (ii)‏
toiletes em restaurantes, aeronaves, etc... caixas de supermercado controle de estoque pilhas

175 Regiões críticas - exemplos (iii)‏
class TestStack, uma pilha que não é threads-safe JavaAppsHopson&Ingram/Chap08/TestStack.java (pág. 240)‏ JavaAppsHopson&Ingram/Chap08/StackApplet.java (pág. 238)‏ razão: dois diferentes threads poderiam usar ao mesmo tempo TestStack, com a seguinte seqüência de código: PUSH: ++top; POP: Integer I = s[top]; POP: s[top] = null; POP: --top; PUSH: s[top] = item; No caso, pop() tentaria retornar um topo de stack que ainda não teria sido atribuído.

176 Scheduling e Prioridades (i)
Preemptive Time Scheduling: O Scheduler dá às tasks (process ou threads) pequenas fatias de tempo (time-slices) para que sejam executadas nestes intervalos. Ex.: Windows 95 e Unix. Nonpremptive Time Scheduling: uma task não dá a uma outra task a chance de ser executada, até que ela tenha terminado o seu processamento ou tenha, ela própria, cedido o seu tempo.

177 Priority preemptive, round robin scheduling
Alta Prioridade Baixa

178 Priority preemptive, round robin scheduling
A qualquer momento, se um thread de mais alta prioridade que o thread corrente torna-se executável (runnable), ele ganha o controle da CPU em detrimento do thread corrente e inicia execução. Por default, aplica-se o schedule round robin a threads de mesma prioridade, o que quer dizer que uma vez que o trhead inicie a sua execução, a mesma continua até que o thread: Sleeps -- invoca Thread.sleep() ou wait() Espere por um lock -- para executar um método sincronizado bloqueie em I/O -- em invocações a xread() ou em accept()‏ Explicitamente libere controle -- invoca yield()‏ Termine -- Completa o seu método alvo (target) ou é terminado por uma invocação a stop.

179 Priority preemptive, time-sliced scheduling
Alta Prioridade Baixa

180 Sincronização em Java (ii)‏
O mecanismo para sincronização das atividades dos threads é baseado no conceito de monitor (C.A.R.Hoare). Um monitor é, essencialmente um lock. É associado ao recurso a que vários threads pretendem ter acesso. Através do lock controla-se o acesso ao recurso. Java controla todo o processo de aquisição e gerenciamento dos locks. Tudo o que o usuário precisa fazer é especificar os recursos que necessitam locks. A keyword synchronized assinala os locais aonde um thread deve adquirir o lock antes de continuar. Em Java cada classe e cada instância de classe possui o seu lock.

181 Synchronized keyword (i)‏
class SpeechSyntethizer { synchronized void say (String words) { //implementação do método ... } Antes de um thread X executar say() deverá adquirir um lock. Isto é dito pela keyword synchronized. Se outro thread Y já possui o lock, então o thread X deverá aguardar até que o thread Y libere o lock e, possivelmente, terá que concorrer com outros threads pelo uso do lock. Quando threads são sincronizados, apenas um thread estará executando o trecho do código.

182 Synchronized keyword (ii)‏
A keyword synchronized também pode ser usada para blocos de código arbitrários. Synchronized (my object) { // funcionalidade a se sincronizada .... }

183 Synchronized keyword (iii)‏
Synchronized void MyMethod() { .... } é equivalente a: void MyMethod() { synchronized (this) { ...

184 Exemplos de Sincronização
JavaAppsHopson&Ingram/Chap08/SyncTestStack.java JavaAppsHopson&Ingram/Chap08/NotifyWaitTestStack.java JavaAppsHopson&Ingram/Chap08/PipeApplet.java Exploring/threads/Clock.java Exploring/threads/UpdateApplet.java Exploring/threads/messagepasser/Consumer.java

185 A Sincronização entre Threads
wait(): quando invocado libera o monitor do objeto (lock) e simplesmente espera (sem efetuar qualquer processamento adicional) até que seja notificado . Existe um método wait() alternativo com opção de timeout. notify(): é invocado por um thread X para acordar um thread que esteja em wait (esperando). O thread acordado passa a buscar possuir o controle do monitor (lock).

186 Prioridades A classe Thread provê três variáveis públicas que podem ser usadas para estabelecer a prioridade do thread: MIN_PRIORITY: indica o valor mínimo de prioridade em que um thread pode ser executado. NORMAL_ PRIORITY: indica o valor default da prioridade em que um thread é executado. MAX_ PRIORITY: indica o valor máximo de prioridade em que um thread pode ser executado. Um thread executando com esta prioridade consumirá a maior parte do tempo disponível da cpu.

187 Outros métodos da classe Thread
currentThread(): retorna uma referência para o Thread corrente. getName(): obtém o nome do Thread. getPriority: retorna a prioridade do Thread. getThreadGroup: retorna o ThreadGroup do thread. isAlive: retorna se o Thread está ativo, i. e., foi ativado via start, mas ainda não morreu (stop). run(): método que define a atividade do Thread. setDaemon(): estabelece o Thread como um daemon. setPriority(): fixa uma prioridade para o Thread. yield(): concede o time-slice do Thread corrente para um outro Thread.

188 public class java. lang. Thread extends java. lang
public class java.lang.Thread extends java.lang.Object implements java.lang.Runnable { // Fields public final static int MAX_PRIORITY; public final static int MIN_PRIORITY; public final static int NORM_PRIORITY; // Constructors public Thread(); public Thread(Runnable target); public Thread(Runnable target, String name); public Thread(String name); public Thread(ThreadGroup group, Runnable target); public Thread(ThreadGroup group, Runnable target, String name); public Thread(ThreadGroup group, String name);

189 // Methods public static int activeCount(); public void checkAccess(); public int countStackFrames(); public static Thread currentThread(); public void destroy(); public static void dumpStack(); public static int enumerate(Thread tarray[]); public final String getName(); public final int getPriority(); public final ThreadGroup getThreadGroup(); public void interrupt(); public static boolean interrupted(); public final boolean isAlive(); public final boolean isDaemon(); public boolean isInterrupted(); public final void join();

190 // Methods ... public final void join(long millis); public final void join(long millis, int nanos) public final void resume(); public void run(); public final void setDaemon(boolean on); public final void setName(String name); public final void setPriority(int newPriority); public static void sleep(long millis); public static void sleep(long millis, int nanos) public void start(); public final void stop(); public final void stop(Throwable obj); public final void suspend(); public String toString(); public static void yield(); }

191 Applets import java.applet.Applet; import java.awt.*;
public class HelloMan extends Applet { public void paint(Graphics g)‏ g.drawString("Hello, world", 0, 20); } <HTML> <HEAD> <TITLE>Hello World</TITLE> </HEAD> <BODY> <APPLET CODE="HelloMan.class" WIDTH=250 HEIGHT=100> </APPLET> </BODY> </HTML>

192 A classe Applet (i)‏ Applets são programas que podem ser embutidos em páginas WEB (documentos html). Podem ser executados por browsers WEB ou pelos Appletviewers. Todos os applets estendem a classe Applet, a qual inclui métodos que permitem operações próprias de ambientes em redes. Estes métodos permitem carregar recursos de um servidor WEB e acompanhar o progresso do download. O Applet é também um panel, que é um tipo de container. Pode, portanto ter vários components e capturar eventos (gerados via teclado, mouse, etc...). Os applets podem implementat Threads através da Runnable Interface.

193 html docs x applets Os applets são referenciados nas páginas WEB (documentos html) através da tag html APPLET. <html> <head><title>Exemplo de Applet embutido em uma página html </title></head> <body> ... <applet code="AudioItem" width=15 height=15> <param name=snd value="Hello.au|Welcome.au"> Java applet that plays a welcoming sound. </applet> ... </body> </html>

194 <!ELEMENT APPLET - - (PARAM | %text)*>
<!ATTLIST APPLET codebase %URL #IMPLIED -- code base -- code CDATA #REQUIRED -- class file -- alt CDATA #IMPLIED -- for display in place of applet -- name CDATA #IMPLIED -- applet name -- width %Pixels #REQUIRED -- suggested width in pixels -- height %Pixels #REQUIRED -- suggested height in pixels -- align %IAlign #IMPLIED -- vertical or horizontal alignment -- hspace %Pixels #IMPLIED -- suggested horizontal gutter -- vspace %Pixels #IMPLIED -- suggested vertical gutter -- > <!ELEMENT PARAM - O EMPTY> <!ATTLIST PARAM name NMTOKEN #REQUIRED -- The name of the parameter -- value CDATA #IMPLIED -- The value of the parameter --

195 Métodos básicos da classe Applet
Todo applet possui os seguintes métodos: init(): invocado na primeira vez em que o applet é carregado (ou sempre que o mesmo é recarregado) pelo browser. start(): invocado sempre que o applet mostrado. stop(): invocado sempre que o applet torna-se oculto. destroy(): invocado quando o usuário abandona o applet.

196 Alguns exemplos de Applets
JavaNow/Chap13/CrossHair/CrossHair.java JavaNow/Chap13/CrossHair2/CrossHair.java JavaNow/Chap13/ConnectTheDots/ConnectTheDots.java JavaNow/Chap13/ConnectTheDots2/ConnectTheDots.java JavaNow/Chap13/ScreenType/ScreenType.java JavaNow/Chap13/ScreenType2/ScreenType.java

197 Métodos da classe Applet para operações em networks (i)‏
CodeBase: diretório, no servidor, de onde provém o applet. DocumentBase (Code): diretório, no servidor, de onde provém o documento html em que o applet se acha embutido. public URL getDocumentBase(): retorna a URL da página html que contém o applet, no servidor. public URL getCodeBase()‏ retorna a URL do diretório do applet, no servidor. ElliotteRustyHarold/java.netprog/javanetexamples/06/AppletBases.java

198 public Image getImage (URL u)‏
Métodos da classe Applet para operações em networks: downloading imagens (i)‏ public Image getImage (URL u)‏ recupera a imagem localizada na URL especificada e coloca-a em um objeto do tipo imagem. Este método depende do AppletContext (do browser WEB ou do applet viewer) para recuperar e interpretar a imagem. Assim, só pode recuperar imagens nos formatos aceitáveis pelo AppletContext. ElliotteRustyHarold/java.netprog/javanetexamples/06/ImageView.java public Image getImage(URL path, String, filename)‏ método similar ao anterior

199 Métodos da classe Applet para operações em networks: downloading imagens (ii)‏
O método getImage() ,p. ex., retorna imediatamente, ainda mesmo antes de saber se a imagem realmente existe. A imagem não é carregada até que alguma outra parte do programa realmente tente desenhá-la, ou se explicitamente força o download. Neste ponto, o interpretador JAVA inicia um novo thread, em separado do thread principal do programa, para fazer o download e processar o arquivo de imagens. As imagens são processadas assincronamente. O programa pode fazer outra coisa enquanto se processa o download.

200 Métodos da classe Applet para operações em networks: downloading imagens (iii)‏
A operação assíncrona das imagens trás alguns problemas: como sabermos que o download da imagem já foi efetuado? e se desejarmos trabalhar com os dados da imagem à medida que eles cheguem? e se desejarmos saber algo sobre as propriedades da imagem antes de podermos realmente trabalharmos com a mesma? e se acontecer algum erro durante o download da imagem? Objetos ImageObservers tratam estes problemas. Eles implementam a interface ImageObserver. Todas as operações que desenham ou examinam objetos Image retornam imediatamente, todavia elas recebem um objeto ImageObserver como parâmetro.

201 A Interface ImageObserver (i)‏
A interface java.awt.image.ImageObserver permite que: um objeto monitore o processo de download (se a imagem está completa, se houve erro, recebe informações sobre os atributos da imagem - width e height, etc...). o usuário seja informado e use a imagem o mais rápido possível, assim que ela estiver disponível. Java.awt.Component implementa a interface ImageObserver. (cada Component é o seu próprio ImageObserver default)‏ Um applet, p. ex., serve como um ImageObserver e invoca repaint() implicitamente, a fim de redesenhar a imagem, quando necessário.

202 A Interface ImageObserver (ii)‏
Exemplo: g.drawImage(thisImage, 0, 0, this) // em um applet this é um ImageObserver no exemplo. Se a imagem está completa ela é desenhada e pronto. Se a imagem não está completa o método ImageUpdate() do Component será invocado periodicamente, dando uma chance de se checar o estado da imagem e responder de acordo. Graphics.drawImage() retorna um boolean. O boolean diz se a imagem foi, ou não, desenhada com sucesso (true= OK).

203 A Interface ImageObserver (iii)‏
public interface java.awt.image.ImageObserver { // flags for the infoflags argument to imageUpdate public final static int ABORT; public final static int ALLBITS; public final static int ERROR; public final static int FRAMEBITS; public final static int HEIGHT; public final static int PROPERTIES; public final static int SOMEBITS; public final static int WIDTH; // Methods public abstract boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height); }

204 A Interface ImageObserver (iv)‏
Outros métodos que têm um objeto ImageObserver como argumento: Image.getWidth(ImageObserver)‏ Image.getHeight(ImageObserver)‏ Image.getProperty(String, ImageObserver)‏ Component.checkImage(Image, ImageObserver)‏ Component.checkImage(Image, int, int, ImageObserver)‏ Component.prepareImage(Image, ImageObserver)‏ Component.prepareImage(Image, int, int, ImageObserver)‏ ComponentPeer.checkImage(Image, int, int, ImageObserver)‏ ComponentPeer.prepareImage(Image, int, int, ImageObserver)‏

205 A Interface ImageObserver (v)‏
A passagem de um objeto ImageObserver como parâmetro a qualquer um dos métodos anteriores sinaliza que o ImageObserver está interessado na imagem e deve ser notificado quando o estado da imagem se alterar. Se a imagem ainda não está disponível, o método ImageUpdate() do Component será invocado periodicamente, quando necessário, pelo objeto ImageObserver. Ele não é invocado explicitamente pelo usuário. ImageUpdate(): retorna: false se a imagem está completa e não mais precisa ser atualizada. true se a imagem ainda precisa ser atualizada, i.e., ainda não está completa. The ImageUpdate() method answers the question: Does this image need to be updated?

206 A Interface ImageObserver (vi)‏
A sua implementação de ImageUpdate() precisa fazer 3 coisas: Verificar o que se alterou na imagem, via o uso das constantes mneumônicas infoflags; Realizar qualquer ação necessária para atualizar o estado do programa em execução; Retorna true se precisa de updates adicionais e false se toda a informação necessária sobre a imagem já está disponível. Infoflags: combinação de constantes mneumônicas que indicam que informação sobre a imagem está disponível ElliotteRustyHarold/java.netprog/javanetexamples/06/ShowImage.java

207 Constantes infoflags ImageObserver.WIDTH = 1 ImageObserver.HEIGTH = 2
ImageObserver.PROPERTIES = 4 ImageObserver.SOMEBITS = 8 ImageObserver.FRAMEBITS = 16 ImageObserver.ALLBITS = 32 ImageObserver.ERROR = 64 ImageObserver.ABORT = 128

208 public void play(URL u):
Métodos da classe Applet para operações em networks: downloading sons (i)‏ Métodos play(): executam o download do arquivo de som e imediatamente o tocam. Métodos getAudioClip(): salvam o arquivo de som para posteriormente tocá-lo. O AppletContext do browser ou do Applet viewer executa o trabalho de download e de tocar o arquivo de som. public void play(URL u): Procura por um arquivo de som na URL u. Se o arquivo é encontrado executa o download e toca-o. Em caso contrário nada acontece. public void play(URL u, String filename)‏ ElliotteRustyHarold/java.netprog/javanetexamples/06/PlaySound.java

209 Métodos da classe Applet para operações em networks: downloading sons (ii)‏
public AudioClip getAudioClip(URL u)‏ A interface AudioClip representa um som. getAudioClip() faz o download de um arquivo de som de um site WEB. Uma vez de posse do objeto AudioClip, pode-se tocá-lo invocando- se os métodos do clip: play() e loop(). AudioClip.play(): toca o arquivo uma vez. AudioClip.loop(): toca o arquivo repetidamente.

210 public AudioClip getAudioClip(URL u, String filename)‏
Métodos da classe Applet para operações em networks: downloading sons (iii)‏ AudioClip.play() e AudioClip.loop() permitem guardar o clip de áudio para uso futuro. Nos métodos play anteriores os dados do arquivo de som são descartados após serem tocados. public AudioClip getAudioClip(URL u, String filename)‏ ElliotteRustyHarold/java.netprog/javanetexamples/06/RelativeGong.java

211 Java.awt.MediaTracker (i)‏
Classe utilitária que monitora o download de uma imagem ou grupo de imagens (audio clips) e permite-nos verificar o seu estado periodicamente, ou esperar até que a operação esteja completa. Como usar um MediaTracker: i) criar uma instância da classe MediaTracker. ii) invocar o método addImage() para cada imagem a ser monitorada. Pode-se associar um identificador único para cada imagem. O identificador controla tanto a ordem de prioridade em que as imagens são trazidas, como possibilita a identificação única de subsets de imagens que podem ser carregadas independentemente. Imagens com um id baixo são carregadas preferencialmente àquelas com id alto.

212 Java.awt.MediaTracker (ii)‏
Antes de se usar a imagem deve-se usar um método como checkID() para verificar se a imagem já está pronta. Outros métodos permitem que se: force o início do download; descubra quais as imagens em um grupo não conseguiram ser carregadas; espere pelo término do processo de download das imagens, etc... ElliotteRustyHarold/java.netprog/javanetexamples/06/trackImage.java myexamples/ImageBlaster.java

213 Java.awt.MediaTracker (ii)‏
public class java.awt.MediaTracker extends java.lang.Object { // Fields public final static int ABORTED; public final static int COMPLETE; public final static int ERRORED; public final static int LOADING; // Constructors public MediaTracker(Component comp); // Methods public void addImage(Image image, int id); public void addImage(Image image, int id, int w, int h); public boolean checkAll(); public boolean checkAll(boolean load); public boolean checkID(int id); public boolean checkID(int id, boolean load);

214 Java.awt.MediaTracker (iii)‏
... // Methods ... public Object[] getErrorsAny(); public Object[] getErrorsID(int id); public boolean isErrorAny(); public boolean isErrorID(int id); public int statusAll(boolean load); public int statusID(int id, boolean load); public void waitForAll(); public boolean waitForAll(long ms); public void waitForID(int id); public boolean waitForID(int id, long ms); }

215 Métodos de Java.awt.MediaTracker (i)‏
public MediaTracker(Component comp)‏ construtor para criar um objeto MediaTracker que monitora as imagens para um dado Component. public void addImage(Image img, int id)‏ Adiciona o objeto img (do tipo Image) à lista das imagens monitoradas pelo objeto MediaTracker e associa a img um id. public void addImage(Image img, int id, int w, int h)‏ ... A imagem será eventualmente redimensionada tendo em vista as dimensões w e h.

216 Métodos de Java.awt.MediaTracker (ii)‏
public boolean checkID(int id)‏ Verifica se todas as imagens com o ID dado que estão sendo monitoradas pelo MediaTracker terminaram o processo de download. Em caso afirmativo retorna true, senão false. Vários objetos Image podem partilhar o mesmo IDI. public synchronized boolean checkID(int id, boolean load)‏ ... Se o argumento load (boolean) é true, todas as imagens com aquele ID que ainda não iniciaram o processo de download passam a fazê-lo.

217 Métodos de Java.awt.MediaTracker (iii)‏
public synchronized boolean checkAll(boolean load)‏ Verifica se todas os objetos Image monitorados pelo MediaTracker terminaram o processo de download. Em caso positivo retorna true, senão, false. Se o argumento load (boolean) é true, inicia a carga de qualquer objeto que ainda não tenha sido carregado Os métodos wait() iniciam o download dos objetos Image monitoradas pelo MediaTracker e, então ficam bloqueados (wait) até que as imagens terminem o download. Caso você não deseje que o seu programa fique em wait esperando as imagens, invoque estes métodos em um novo thread.

218 Métodos de Java.awt.MediaTracker (iv)‏
public void waitForID(int id) throws InterruptedException Força as imagens com o id dado, que são monitoradas por este MediaTracker, a iniciar o loading e, então, espera (wait) até que cada uma tenha terminado o loading, abortado ou recebido um erro. Uma exceção é lançada se um outro thread interromper este thread. public synchronized boolean waitForID(int id, long ms) throws InterruptedException ... Ou até que ms milisegundos tenham sido transcorridos.

219 Métodos de Java.awt.MediaTracker (v)‏
public synchronized boolean waitForAll() throws InterruptedException Inicia o loading de todas as imagens que são monitoradas por este MediaTracker, e, então, espera (wait) até que cada uma tenha terminado o loading, abortado ou recebido um erro. Uma exceção é lançada se um outro thread interromper este thread. Este método deve ser usado por applets de animação a fim de carregar todos os frames antes de iniciar a apresentação dos slides. public synchronized boolean waitForAll(long ms) throws InterruptedException

220 Métodos de Java.awt.MediaTracker (vi)‏
Se há um erro quando um objeto Image é carregado ou redimensionado, o objeto Image é considerado completo, encerrando-se o processo de loading. public synchronized boolean isErrorAny()‏ Verifica se um erro ocorreu durante a carga de qualquer imagem monitorada por este MediaTracker. public synchronized Object[] getErrorsAny()‏ Retorna um array contendo todos os objetos monitorados por este MediaTracker e que apresentaram erro durante a carga.

221 Métodos de Java.awt.MediaTracker (vii)‏
public synchronized boolean isErrorID(int id)‏ Retorna true se qualquer objeto com o ID especificado apresentou um erro enquanto carregava; senão retorna false. public synchronized Object[] getErrorsID(int id)‏ Retorna um array contendo todos os objetos com o ID especificado e que apresentaram erro durante a carga.

222 Métodos de Java.awt.MediaTracker (viii)‏
É possível checar o estado de grupos de objetos Image , porém não de objetos isolados. Media Status Constants MediaTracker.LOADING = 1 - pelo menos um objeto Image do grupo ainda está em processo de download. MediaTracker.ABORTED = 2 - o processo de loading abortou para pelo menos um objeto Image do grupo. MediaTracker.ERRORED = 4 - Um erro ocorreu durante o processo de loading para pelo menos um objeto Image do grupo. MediaTracker.COMPLETE = 8 - pelo menos um objeto Image do grupo foi carregado com sucesso.

223 Métodos de Java.awt.MediaTracker (ix)‏
public int statusAll(boolean load)‏ Retorna o status de todos os objetos monitorados por este MediaTracker. Se o argumento load é true qualquer objeto que ainda não iniciou o loading vai iniciá-lo. Em caso contrário, não. public int statusID(int id, boolean load)‏ Retorna o status de todos os objetos que compartilham o id especificado e que são monitorados por este MediaTracker. Se o argumento load é true qualquer objeto com o id especificado e que ainda não iniciou o loading vai iniciá-lo. Em caso contrário, não.

224 Transmissão de Informação na Internet
Datagrama = Header + Payload Header = (Address + Port)source + (Address + Port)destination + (informações para permitir a transmissão confiável)‏ Payload = os dados Protocolos: Connection Oriented (TCP - Transmission Control Protocol) Connectionless (UDP - User Datagram Protocol)‏

225 O Paradigma Cliente-Servidor (i)‏
Solução para o problema do “rendevous” prog A prog B host X host Y

226 O Paradigma Cliente-Servidor (ii)‏
Solução no Modelo Cliente / Servidor Em qualquer par de aplicações que se comuniquem, um lado deve iniciar a execução e esperar indefinidamente que o outro lado o contacte. Servidor: O programa que aguarda os pedidos dos clientes. Cliente: O programa que toma a iniciativa de iniciar a comunicação.

227 O Paradigma Cliente-Servidor na Internet
servidores - “sw” clientes - “sw” ports ftp client ftp server telnet 23 Netscape httpd http 80 smtp 25 smtp s. Host A - “HW” Host B - “HW” /etc/services - quais são as portas associadas a que serviços

228 Copyright ©1997 by Oscar Luiz Monteiro de Farias, D.Sc
World Wide Web Copyright ©1997 by Oscar Luiz Monteiro de Farias, D.Sc

229 World Wide Web host 1 - br host 2 - ca host 3 - br host 4 - fr
rerererre ytghgfhg gfhgfhgfh nnbvnbnb ffdf 999 ooiopiopop pooopioiop poiipoiopi uiouuioui iuiouuuiui nmm,mnm rerererre ytghgfhg gfhgfhgfh nnbvnbnb rerererre ytghgfhg gfhgfhgfh nnbvnbnb jjlkdjjdjjj dsdadadd dsdasd host 3 - br ooiopiopop pooopioiop poiipoiopi uiouuioui iuiouuuiui nmm,mnm ooiopiopop pooopioiop poiipoiopi uiouuioui iuiouuuiui nmm,mnm ooiopiopop pooopioiop poiipoiopi uiouuioui iuiouuuiui nmm,mnm rerererre ytghgfhg gfhgfhgfh nnbvnbnb hfhgfh jjghjhgjhg kjlkjlllllll rerererre ytghgfhg gfhgfhgfh nnbvnbnb lljkljkl khjkhjkkk rerererre ytghgfhg gfhgfhgfh nnbvnbnb ffdf 999 ooiopiopop pooopioiop poiipoiopi uiouuioui iuiouuuiui nmm,mnm host 4 - fr World Wide Web host 5 - us

230 java.net.InetAddress (i)‏
uma unstância de java.net.InetAddress representa um endereço na Internet data members: String hostName; int address (32 bit IP address) Não há construtores public Há três métodos estáticos que retornam objetos InetAddress

231 java.net.InetAddress (ii)‏
public static InetAddress InetAddress.getByName(String hostame)‏ usa o DNS para retornar o endereço IP do host. InetAddress address = InnetAddress.getByName(“ public static InetAddress[] InetAddress.getByName(String hostame)‏ (para máquinas com vários Ips - endereços Internet)‏ public static InetAddress InetAddress.getLocalHost()‏ (retorna o endereço IP da máquina que está executando o programa)‏

232 java.net.InetAddress (iii)‏
Métodos para se obter o valor dos DataMembers: public String getHostName()‏ retorna um String que contém o hostname do objeto public byte[] get.Address()‏ retorna um endereço IP como um array de bytes em network byte order; o byte mais significativo do endereço IP é o 10 byte do array; os bytes retornam sem sinal; bytes com valor >= 127 são tratados como números negativos int unsignedByte = myByte <0 ? myByte : myByte

233 java.net.InetAddress (iv)‏
Métodos herdados da classe Object e que sofrem override: public boolean equals(Object myObject)‏ public int HashCode()‏ retorna um int, quando os objetos InetAddress são usados como chaves em hash tables. public String toString()‏ ex.: método invocado implicitamente objetos InetAddress são passados como argumentos para System.out.println().

234 java.net.URL (i)‏ Ë a forma mais simples de um programa JAVA localizar e recuperar dados na Internet. Não precisa se preocupar com: protocolo o formato dos dados (que se deseja recuperar)‏ Atualmente JAVA só pode manipular poucos protocolos e content types (formatos de dados)‏ O usuário pode adicionar novos protocol handles e content types.

235 java.net.URL (ii)‏ É uma abstração para uniform resource locator (URL)‏ URL inclui: protocol, hostname, port, path, filename e document section. Os campos de java.net.URL só são visíveis às classes do package java.net. Todavia, pode-se recuperá-los via acessors (get methods) e inicializá-los via construtores. JDK 1.02 suporta: http, ftp, news, mailto, gopher, files URLs.

236 java.net.URL (iii)‏ Construtores: public URL URL (String url) throws MalformedURLException public URL URL(String protocol, String host, String file) throws MalformedURLException public URL URL(String protocol, String host, int port, String file) throws MalformedURLException para usar com portas não default public URL URL(URL u, String s) throws MalformedURLException Constrói uma URL absoluta, a partir de uma URL relativa

237 java.net.URL (iv)‏ Outras fontes de objetos URL:
getDocumentBase() - da classe java.applet.Applet - pg. html getCodeBase() - da classe java.applet.Applet - dir. do applet Particionamento de uma URL - como recuperar os data members (fields) da classe URL. public String getProtocol()‏ public String getHost()‏ public int getPort()‏ public String getFile()‏ public String getRef() // retorna a named aanchor da URL

238 java.net.URL (v)‏ Como Recuperar dados da URL: public final InputStream openStream() throws java.io.IOException estabelece uma conexão com o recurso referenciado pela URL especificada executa o handshake entre o cliente e o servidor retorna um InputStream de onde os dados podem ser lidos os dados do InputStream são raw data correspondente ao conteúdo do arquivo referenciado pela URL Exemplo: ElliotteRustyHarold/05/viewsource.java

239 java.net.URL (vi)‏ Se desejarmos ver os headers do protocolo deveremos usar o método openConnection(). Para recuperar os dados de um .GIF ou .JPEG pode-se ler o InputStream byte a byte com readByte(). Caso se deseje processar um arquivo de um determinado tipo (ex. html), a melhor abordagem é escrever um content handler para arquivos html e, então, invocar getContent().

240 java.net.URL (vii)‏ public URLCOnnection openConnection() throws java.io.IOException abre um socket para a URL especificada e retorna um objeto URLConnection o objeto URLConnection representa uma conexão aberta para um recurso da Internet. usado para comunicação direta com o servidor além dos dados do arquivo recebe todos os headers do protocolo

241 java.net.URL (viii)‏ public final Object getContent() throws java.io.IOException outra forma de fazer o download dos dados referenciados pela URL getContent() tenta construir um objeto: texto em ASCII ou html --- algum tipo de InputStream .GIF ou JPEG --- ImageProducer getContent() opera via o campo Content-type do MIME header dos dados que ele recupera do servidor.

242 java.net.URL (ix)‏ se o servidor não usa MIME headers ou envia um Content-type não familiar lança uma ClassNotFoundException.. lança uma IOException se o objeto não pode ser recuperado. a maior parte dos tipos de dados ainda não é suportada por Java usar o operador instanceof para ver o tipo do objeto retornado. Exemplo: ElliotteRustyHarold/05/getObject.java

243 java.net.URL (x)‏ Métodos utilitários da classe URL
public boolean samefile (URL other)‏ verifica se dois objetos URL apontam para o mesmo recurso. Compara apenas a URL e não o conteúdo dos arquivos ( é diferente de public String toExternalForm()‏ retorna um string que representa a URL método redundante e equivalente a toString Métodos da classe Object que sofrem override pela classe URL: public String toString() public boolean equal(Object o)‏ public int hashCode()‏

244 java.net.URL (xi)‏ public static synchronized void setURLStreamHandlerFactory (URLStreamHandlerFactory fac)‏ É responsável por fazer o parsing da URL - recuperar o tipo de protocolo - e, então construir o objeto URLConnection apropriado para manipular a conexão com o servidor. A classe URL encoder codifica todos os caracteres da URL que não sejam letras, dígitos, e underscore. como codificar: percentsign (%) + dois dígitos hexadecimais com o valor ASCII do caracter (space = %20)‏ public static String encode(String s)‏ retorna um novo string com a URL devidamente codificada

245 Sockets Socket Inovação do Berkeley UNIX
Permite ao programador tratar uma conexão em rede como qualquer outro stream de dados, em que se pode ler ou gravar. Semelhante a arquivos, inclusive usando ss mesmas funções para ler, gravar, etc ... A comunicação é bidirecional (full duplex)‏

246 Operações Básicas dos Sockets
1. Estabelecer uma conexão com um host remoto (para enviar e receber dados)‏ 2. Enviar dados 3. Receber Dados 4. Fechar a conexão 5. Associar-se (bind) a uma porta 6. Escutar (listen) os dados que chegam 7. Aceitar conexões de máquinas remotas na porta especificada 1, 2, 3 e Clientes e Servidores --- classe java.net.Socket 5, 6 e Servidores --- classe java.net.ServerSocket

247 Cliente Servidor início Cria o Server-socket Cria o socket
Aceita conexões Troca de dados protocolo protocolo Close socket Close socket fim

248 A Comunicação Cliente-Servidor: Abrindo uma Conexão
Quando um servidor está executando, ele está ouvindo uma porta e esperando pela ocorrência de uma conexão. Tecnicamente falando, o cliente abre um “socket” e associa este “socket” com a porta. Como em UNIX tudo é arquivo, um “socket” é um tipo especial de arquivo que possibilita I/O para a rede. Quando se abre um “socket”, do ponto de vista do cliente está se criando um arquivo virtual. Quando se escreve neste arquivo, na realidade está se enviando dados para a rede

249 java.net.Socket (i)‏ Construtores
public Socket (String host, int port) throws UnknownHostException, IOException Cria um socket TCP na porta dada do host remoto e intenta conectar-se ao mesmo. Exemplo: ElliotteRustyHarold/07/lookForPorts.java public Socket (InetAddress host, int port) throws IOException

250 java.net.Socket (ii)‏ public Socket (Strinh host, int port, InetAddress interface, int localPort) throws IOException (só em Java 1.1)‏ Cria um socket TCP na porta dada do host especificado (dois 1os argumentos) e tenta conectar-se. A conexão é feita a partir da interface de rede e da porta local especificados nos dois últimos argumentos. Se localPort = 0 escolhe uma das portas livres disponíveis. public Socket (InetAddress host, int port, InetAddress interface, int localPort) throws IOException (só em Java 1.1)‏

251 java.net.Socket (iii)‏ protected Socket() (só em Java 1.1)‏
usado para construir uma subclasse de Socket e implementar um tipo especial de Socket. inicializa a superclasse sem conectar o socket. instala o SocketImpl default (factory ou java.net.PlainSocketImpl). a maior parte da implementação do novo tipo de Socket (nova classe) será escrita num objeto SocketImpl. protected Socket(SocketImpl impl) (só em Java 1.1)‏ instala o objeto SocketImpl impl quando cria o novo objeto Socket. O objeto Socket é criado, mas não conectado.

252 java.net.Socket (iv)‏ Como obter informações sobre um socket:
public InetAddress getInetAddress()‏ retorna o IP do host. public int getPort()‏ retorna a porta, no host remoto, em que o socket está conectado. public int getLocalPort()‏ a porta local é escolhida pelo sistema em run time dentre as portas livres disponíveis . public InetAddress getLocalAddress()‏ diz em que network interface o socket está conectado. Exemplo: ElliotteRustyHarold/07/getSocketInfo.java

253 java.net.Socket (v)‏ Lendo e Gravando em Sockets:
public InputStream getInputStream() throws IOException retorna um raw input stream que pode ser usado pelo programa para ler dados do socket. normalmente encadeia-se o InputStream em um DataInputStream para maior funcionalidade. Exemplo: ElliotteRustyHarold/07/daytimeClient.java public OutputStream getOutputStream() throws IOException retorna um raw output stream que pode ser usado pelo programa para gravar dados na outra ponta do socket. Exemplo: ElliotteRustyHarold/07/echoClient.java

254 java.net.Socket (vi)‏ public synchronized void close() throws IOException método para fechar a conexão. Boa prática de programação, especialmente levando-se em conta servidores, que rodam por um período indefinido de tempo. Métodos da classe Object: Apenas o método toString sofre override. Exemplo: ElliotteRustyHarold/07/finger.java Exemplo: ElliotteRustyHarold/07/whois.java

255 Ciclo de Vida de um Servidor (i)‏
1. Cria-se um novo ServerSocket em uma porta determinada (construtor ServerSocket()). 2. O ServerSocket escuta (listens)a porta usando o método accept(), esperando por novas conexões. accept() bloqueia o servidor até que um cliente tente uma conexão. Neste ponto accept() retorna um objeto socket que conecta o cliente ao servidor. 3. Efetua-se a ocnversação entre o cliente e o servidor, de acordo com um determinado protocolo. (Os métodos getInputStream() e getOutputStream() são usados, respectivamente, para ler e gravar no socket.)‏

256 Ciclo de Vida de um Servidor (ii)‏
4. O servidor ou o cliente (ou ambos) fecham a conexão. 5. O servidor retorna ao passo 2 e espera por novas conexões. Freqüentemente instancia-se um novo thread para cada nova conexão (passos 3, 4 e 5 do ciclo de vida )‏ Exemplo:ExploringJava/net/httpd/TinyHttpd.java

257 java.net.ServerSocket (i)‏
Construtores: public ServerSocket(int port) throws IOException, BindException cria um server socket na porta especificada. se port = 0, escolhe uma porta dentre as disponíveis (anonymous port). Exemplo: ElliotteRustyHarold/08/lookForLocalPorts.java public ServerSocket(int port, int queuelength) throws IOException, BindException cria um ServerSocket na porta dada, com um tamanho de fila pré-determinado. recusa novas conexões se #conexões > queuelength.

258 java.net.ServerSocket (ii)‏
public ServerSocket(int port, int queuelength, InetAddress bindAddress) throws IOException (java 1.1)‏ cria um ServerSocket na porta dada, com um tamanho de fila pré-determinado. recusa novas conexões se #conexões > queuelength. Este construtor é útil para servidores com múltiplos endereços IP. O ServerSocket só se associa (binds) com o endereço IP local especificado. Protected ServerSocket (java 1.1)‏ Usado em subclasses de ServerSocket quando se quer prover um SocketImpl próprio, talvez para implementar protocolos de segurança ou transitar via um proxy server.

259 java.net.ServerSocket (iii)‏
public Socket accept() throws IOException método invocado quando todo o set up do servidor já terminou e ele está pronto para aceitar conexões. bloqueia, i. e., suspende o fluxo de execução, e espera até que um cliente se conecte. quando o cliente se conecta, retorna um objeto Socket. usa-se então, os métodos getInputStream e getOutputStream no Socket retornado para efetivar a comunicação com o cliente. Exemplo: ElliotteRustyHarold/08/daytimeServer.java public void close() throws IOException ServerSocket close - libera a porta no host local, possibilitando a um outro server associar-se (binds) à porta. Server close - quebra a conexão entre os hosts local e remoto.

260 java.net.ServerSocket (iv)‏
public InetAddress getInetAddress()‏ retorna o endereço IP do servidor (local host). public int getLocalPort()‏ ServerSocket faz o override do método toString da classe Object. Exemplo: ElliotteRustyHarold/08/clientTester.java particularmente interessante para testar clientes, de forma similar à usada pelo telnet para testar servidores. Exemplo: ElliotteRustyHarold/08/Redirector.java Um redirecionador.


Carregar ppt "Um Curso Orientado a Objetos"

Apresentações semelhantes


Anúncios Google