Universidade Federal do Maranhão – UFMA
Campus do Bacanga – São Luís
Introdução a Programação
Orientada a Objetos (Java)
Dr. Denivaldo Lopes
Ano: 2007.1
abril, 2007
1
Objetivos da disciplina
• A disciplina de IPOO (Java) tem como
objetivo formar profissionais capazes de
desenvolver sistemas de software;
• coordenar projetos baseados em sistemas de
software.
• Habilitar profissionais para empregar modernas
ferramentas de computação como meio de
apoio a realização de tarefas baseadas em
sistemas de software.
2
Objetivos da disciplina
• Capacitar o aluno a definir os princípios
necessários e as qualidades desejadas no
desenvolvimento de sistemas de software.
• Favorecer o surgimento de situações para
o aluno reconhecer as principais
metodologias, métodos e ferramentas de
software, qualificando a mais adequada a
cada situação..
3
Conteúdo Programático
1. Introdução a Programação Orientada a Objetos.
1.1 Conceitos da orientação a objetos: Classe,
Atributos, Métodos, Objeto.
2. Linguagem Java.
2.1 Primeiro programa em Java: HelloWorld
2.2 Aritmética em programas Java
2.3 Operadores relacionais e lógicos
2.4 Classes, objetos, métodos e variáveis de
instância e construtores
2.5 Instruções de controle (if...else, while, for,
do...while, switch, break e continue)
2.6 Herança
4
Conteúdo Programático
2.7 Polimorfismo
2.8 Tratamento de Exceção
2.9 Arquivos e Fluxos
2.10 Recursão
2.11 Programando com Threads
2.8 Programação em rede com Java
2.8.1 Comunicação Assíncrona
2.8.2 Comunicação Síncrona
5
Conteúdo Programático
3. Coleções
3.1 Arrays
3.2 Collections
3.3 Lists, ArrayList, Iterator, LinkedList e Vector
3.4 Algoritmos de ordenação: sort, shuffle, busca
binária
3.4 Stack
3.5 PriorityQueue
4. Componentes GUI
4.2 AWT Nativo
4.1 Introdução a SWING
6
Conteúdo Programático
5. Applets
5.1 HTTP
5.2 Visão geral de HTML
5.3 Criação de Applets
6. JNI (Java Native Interface)
6.1 Conceitos
6.2 Exemplos
7. Introdução a UML (Unified Modeling Language)
7.1 Diagrama de Caso de Uso
7.2 Diagrama de Classe
7.3 Diagrama de Seqüência
7.4 Diagrama de Atividade
7
Metodologia
• Aulas expositivas e discussões em classe.
• Estudo da plataforma Java para exemplificar os
princípios e conceitos da orientação a objeto.
• Estudos de caso para exemplificar a utilização Java.
• Os alunos serão orientados no desenvolvimento de
aplicações baseadas em Java.
• Pesquisa de assuntos avançados.
• Trabalhos individuais para sedimentar a
aprendizagem.
8
Cronograma de
Aulas, Trabalhos e Avaliações
Mês
Dias da disciplina
Abril
24, 25
Maio
2, 8, 9, 15, 16, 23, 26, 29,
Junho
2, 12, 13, 16, 19, 20, 26, 27
Julho
Agosto
3, 4, 10, 11, 14, 17,18, 28, 31
1,4, 7, 8, 14
Prova escrita
Reposição
Apresentação de trabalho
Final
2 horários por dia : horários 10 e 11
9
término do semestre letivo 2007.1 - ?
BIBLIOGRAFIA:
H. M. Deitel, P. J. Deitel, Java: como programar, 6. ed.,
Pearson Prentice Hall, 2005.
James Gosling, Bill Joy, Guy L. Steele Jr., and Gilad Bracha,
The Java Language Specification, Third Edition, Prentice Hall
PTR; 3 edition , June 14, 2005.
Adilson da Silva Lima, UML 2.0: DO REQUISITO À SOLUÇÃO,
ed. ÉRICA, 2005.
Cygwin and Java, Disponível em http://www.inonit.com/cygwin/
Sheng Liang, The Java Native Inteface - Programmer's Guide
and Specification, Addisson-Wesley, 2003.
10
Introdução a Programação Orientada a
Objetos.
Conceitos da orientação à objetos:
- Classe;
- Atributos;
- Métodos;
- Objeto.
11
Conceitos da orientação à objetos
• Uma linguagem orientada à objetos.
• O que é um objeto?
– De uma forma geral, podemos ver um objeto
um tanto que uma abstração do mundo real.
• Uma abordagem usando objeto tem como
finalidade permitir a modelagem das
propriedades estáticas e dinâmicas do
ambiente no qual estão definidas as
necessidades, denominadas de domínio
do problema.
12
Conceitos da orientação à objetos
• A orientação à objeto se baseia em cinco
conceitos básicos:
– Objeto;
– Mensagens;
– Classe;
– Generalização;
– Polimorfismo.
13
Conceitos da orientação à objetos
• Objeto
– Um objeto é uma unidade atômica
formada da união de um estado e de
comportamento.
– Um objeto fornece uma relação de
coesão interna muito forte e um fraco
acoplamento com o exterior.
– Os objetos se comunicam entre si
através de troca de mensagens.
14
Conceitos da orientação à objetos
• Objeto
– Cada objeto contém um estado interno que é
próprio dele mesmo e um comportamento visível
pelos outros objetos.
– Um objeto também tem uma identidade que o
diferencia dos outros objetos.
– A identidade permite distinguir todo objeto de
forma não ambígua, e isto independe de seu
estado.
Objeto = Estado + Comportamento + identidade15
Conceitos da orientação à objetos
• Objeto
– A identidade é um conceito, não se representa
de uma maneira específica.
– Cada objeto possui uma identidade atribuída de
maneira implícita no momento da criação do
objeto e nunca é modificada.
:Um objeto A
Estados de A
Mensagem
:Um objeto B
Estados de B
16
Conceitos da orientação à objetos
• Objeto: exemplo
a1:Avião
sar
Pou
[Em vôo]
t1:Torre de controle
Estados
De c
ola
r
a2:Avião
[No solo]
17
Conceitos da orientação à objetos
• Classe
– O mundo real é composto de inúmeros objetos
em interação.
– Os objetos são geralmente muito complexos
para serem compreendidos em sua
integridade.
– Para reduzir a complexidade, ou para gerenciála, o ser humana aprendeu a agrupar os
elementos que se assemelham e a distinguir as
estruturas de mais alto nível de abstração,
18
excluindo os detalhes inúteis.
Conceitos da orientação à objetos
• Classe
– Uma classe descreve um domínio de definição
de objetos.
– Cada objeto é originado de uma classe.
– As generalidades são contidas na classe e as
particularidades são contidas nos objetos.
– O processo de criação de um objeto à partir de
uma classe é chamado de instanciação.
19
Conceitos da orientação à objetos
• Classe: representação
Classe A
atributo1: TipoAtributo
atributo2: TipoAtributo
atributoN: TipoAtributo
método1(parâmetro:TipoParâmetro):TipoRetorno
método2(parâmetro:TipoParâmetro):TipoRetorno
métodoN(parâmetro:TipoParâmetro):TipoRetorno
20
Conceitos da orientação à objetos
• Classe e Objeto
Cachorro
Raça: String
Cor: String
Peso: Float
Altura:Float
Idade:Integer
<<Instância de>>
spike:Cachorro
Raça= ”Pastor Alemão”
Cor= ”Preto e marrom”
Peso= 6,5
Altura=0,8
Idade=8
21
Conceitos da orientação à objetos
• Classe e Objeto
Abstração
Objetos
Tipos de
dados abstratos
Funções
Mnemônicos
Códigos Binários
Facilidade de Programação
22
Conceitos da orientação à objetos
• Classe: Visibilidade de atributos e métodos
– O nível de visibilidade pode ser:
• Público: atributos e métodos são visíveis e acessíveis à
partir de métodos da própria classe ou de uma outra
classe.
• Privado: os atributos privados somente podem ser
acessados por métodos da classe. Da mesma forma,
os métodos privados somente podem ser acessados
por outros métodos da própria classe.
• Protegido: os atributos e métodos podem ser vistos e
acessados somente por métodos da própria classe ou à
partir de classes derivadas.
23
Conceitos da orientação
à objetos
Atributos privados
somente
podem ser acessados e
modificados por métodos da
isibilidade
própria classe.
• Classe: representação de v
Representação:
Exemplo:
Classe
+ atributo público
# atributo protegido
- atributo privado
+ método público( )
# método protegido( )
- método privado( )
Métodos públicos podem ser
chamados por métodos de
outra classe.
NúmeroComplexo
-ParteReal:Float
-ParteImaginária:Float
+adição(num1:NúmeroComplexo):NúmeroComplexo
+sub(num1:NúmeroComplexo):NúmeroComplexo
+mult(num1:NúmeroComplexo):NúmeroComplexo
+div(num1:NúmeroComplexo):NúmeroComplexo
+getReal():Float
+getImag():Float
24
Conceitos da orientação à objetos
• Generalização.
– A generalização consiste em capturar os
elementos comuns (atributos e operações) de
um conjunto de classes em uma classe mais
genérica, chamada de superclasse.
– As classes são organizadas segundo uma
hierarquia que pode ser vista como uma
árvore: uma superclasse é uma abstração de
suas sub-classes.
25
Conceitos da orientação à objetos
• Generalização: exemplo.
Abstrações mais gerais
Veículo
Veículo Terrestre
Carro
Caminhão
Veículo Aéreo
Moto
Avião
Helicóptero
Extensão pela especialização
26
Conceitos da orientação à objetos
• Generalização: exemplo.
Abstrações mais gerais
Animal
Carnívoro
Leão
Onça
Herbívoro
Coiote
Ovelha
Cavalo
Extensão pela especialização
• A generalização e a especialização são
dois pontos de vista antagônicos do
conceito de classificação.
27
Conceitos da orientação à objetos
• Generalização: exemplo.
SuperClasse
Classe mais geral
Classe mais especializada
SubClasse
• A especialização é a base para a programação
por extensão e para a reutilização.
28
Conceitos da orientação à objetos
• Generalização: características.
A
A
B
A
Proibido
B
C
Proibido
Transitividade
• A generalização não é reflexiva e nem é
simétrica.
• A generalização é transitiva.
29
Conceitos da orientação à objetos
• Herança: permite a
construção de uma
classe à partir de uma ou
várias outras classes,
compartilhando atributos
e operações, e formando
uma hierarquia de
classes.
• As classes filhas herdam
as características das
classes pais.
A
-attrA1 : Double
-attrA2 : Integer
+attrA3 : String
#attrA4 : Double
+getA1() : Double
+getA2() : Integer
B
-attrB1 : Boolean
-attrB2 : Long
+getB1() : Boolean
+getB2() : Boolean
30
Conceitos da orientação à objetos
• Colisões de nomes na herança.
31
Conceitos da orientação à objetos
• Polimorfismo: descreve a
característica de um
elemento que pode ter
várias formas.
• O polimorfismo de
operação permite fazer
chamadas de uma
operação de diversas
formas.
• Não confundir com
sobrecarga de métodos.
32
Conceitos da orientação à objetos
• Sobrecarga de
métodos: permite
que métodos
compartilhem o
mesmo nome, mas
com diferentes
parâmetros e/ou
retorno.
33
Introdução a linguagem de programação Java
– Conceitos da orientação à objetos: Classe, Atributos, Métodos,
Objeto
– Primeiro programa em Java: HelloWorld
– Aritmética em programas Java
– Operadores relacionais e lógicos
– Classes, objetos, métodos e variáveis de instância e construtores
– Instruções de controle (if...else, while, for, do...while, switch, break e
continue)
– Herança
– Programando com Threads
– Programação em rede com Java: Sockets
34
Tutoriais sobre Java
• Trail: Learning the Java Language.
– Disponível em:
http://java.sun.com/docs/books/tutorial/java/TO
C.html#data
35
Introdução a Java
• Em 1991, a Sun Microsystems financiou um
projeto de pesquisa corporativa interno com o
codinome Green (Patrick Naughton, Mike
Sheridan, e James Gosling).
• No projeto Green, uma linguagem baseada em
C++ foi desenvolvida e denominada de Oak.
• Mais tarde, esta linguagem foi introduzida na Web
e se passou a chamar Java.
• Em 1995, Java despertou o interesse da
comunidade, pois aprimorava as funcionalidades
de servidores Web, possibilitando a criação de
páginas Web dinâmicas.
36
Introdução a Java
• Java é um ambiente de execução presente
em:
– web browsers;
– Mainframes;
– SOs;
– celulares;
– palmtops;
– cartões inteligentes, entre outros.
37
Introdução a Java
• Características:
– Orientação a objeto – baseada no modelo Smalltalk
e Simula 67.
– Portabilidade - independência de plataforma - "write
once run anywhere";
– Recursos de Rede – suporte para Socket e TCP/IP.
– Segurança – através do Sandbox.
– Bytecode interpretado – código executado pela JVM
(Java Virtual Machine).
– Sintaxe similar a Linguagem C/C++.
– Facilidades de Internacionalização: através de
caracteres Unicode.
38
Introdução a Java
• Características:
– Simplicidade na especificação (JVM): qualquer
empresa pode implementar a especificação da JVM.
– Um vasto conjunto de bibliotecas (APIs): bibliotecas
disponíveis com o J2SDK.
– Suporte à programação distribuída e multitarefa:
suporta threads, monitor, e chamada remota de procedimento.
– Alocação/Desalocação dynâmica de memória:
através do Garbage Collector (Coletor de lixo) a memória não mais
utilizada pode ser recuperada e usada outra vez pelo SO ou pela
própria JVM.
– Carga Dinâmica de Código: o código pode ser carregado
segundo a demanda.
39
Introdução a Java
40
Introdução a Java
• Java está disponível em 3 edições:
– Java 2 Standard Edition (J2SE): é a tecnologia Java para
computadores pessoais, notebooks e arquiteturas com elevado poder
de processamento. J2SE possui duas divisões:
• Java Standard Development Kit (JSDK): é constuído por um conjunto
de ferramentas (compiladores, debugger, ...) que suportam a criação de
programas Java.
• Java Runtime Edition (JRE): contém o necessário para a execução dos
programas Java.
– Java 2 Micro Edition (J2ME): é a tecnologia Java para
dispositíveis móveis com limitação de processamento e memória.
Pode ser encontratado em duas formas:
• Connected Limited Device Configuration (CLDC): destinado a
celulares, smartphones e dispositivos limitados.
• Connected Device Configuration (CDC): destinado para Palmtops,
PocketPCs e dispositivos com maior poder de processamento e memória.
– Java 2 Enterprise Edition (J2EE): é a tecnologia Java para
aplicações corporativas (inclui Java Enterprise Beans).
41
Introdução a Java
42
Fonte: http://java.sun.com/javase/technologies/index.jsp
Introdução a Java
• Um ambiente de
desenvolvimento
Java típico.
43
Primeiro programa em Java:
HelloWorld
public class HelloWorld {
// método principal que inicia a execução do aplicativo Java
public static void main(String[] args) {
// Imprime uma mensagem no console
System.out.println("Hello World! I am a program in Java...!")
}
}
44
Primeiro programa em Java:
HelloWorld
45
Conhecendo o compilador Java
46
Exemplo 2
import java.util.Scanner; // importa a classe Scanner do pacote java.util
// Classe principal
public class HelloWorld2 {
//
método principal que inicia a execução do aplicativo Java
public static void main(String[] args) {
//declação de variáveis
// cria variavel para armazenar o nome do usuário
String userName="none ";
// cria variavel para armazenar a idade do usuário
int userAge=0;
// cria um objeto da classe Scanner para ler o teclado
Scanner inputKeyboard = new Scanner(System.in);
// Imprime uma mensagem no console
System.out.println("Hello World! I am a program in Java...!");
System.out.println("What is your name?");
// Ler uma string de caracteres do teclado
userName = inputKeyboard.nextLine();
// Imprime o nome do usuário usando formatação
System.out.printf("Hi %s",userName);
// Imprime uma mensagem no console
System.out.println("\nHow old are you?");
// Ler um número inteiro do console
userAge = inputKeyboard.nextInt();
// Imprime uma mensagem no console com formatação, %s string e %d número inteiro
System.out.printf("%s is %d years old.",userName,userAge);
47
}
}
Tipos de dados Primitivos
Tipos de Dados Primitivos
Palavra-chaave Descrição
Tamanho/Formato
Inteiros
byte
Byte
8-bit complemento de dois
short
Short integer
16-bit complemento de dois
int
Integer
32-bit complemento de dois
long
Long integer
64-bit complemento de dois
float
Ponto flutuante precisão simples
32-bit IEEE 754
double
Ponto flutuante precisão dupla
64-bit IEEE 754
char
Um único caractere
16-bit caractere Unicode
boolean
Um valor lógico (true ou false) true ou false
Números reais
Outros
48
Exemplo 3
/*
* Programa que retorna o valor máximo para tipos de dados simples
* Fonte: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/
ex5/MaxVariablesDemo.java
*/
public class MaxVariablesDemo {
public static void main(String args[]) {
//integers
byte largestByte = Byte.MAX_VALUE;
short largestShort = Short.MAX_VALUE;
int largestInteger = Integer.MAX_VALUE;
long largestLong = Long.MAX_VALUE;
//real numbers
float largestFloat = Float.MAX_VALUE;
double largestDouble = Double.MAX_VALUE;
//other primitive types
char aChar = 'S';
boolean aBoolean = true;
//Display them all.
System.out.println("The largest byte value is "
+ largestByte + ".");
49
Exemplo 3
System.out.println("The largest short value is "
+ largestShort + ".");
System.out.println("The largest integer value is "
+ largestInteger + ".");
System.out.println("The largest long value is "
+ largestLong + ".");
System.out.println("The largest float value is "
+ largestFloat + ".");
System.out.println("The largest double value is "
+ largestDouble + ".");
if (Character.isUpperCase(aChar)) {
System.out.println("The character " + aChar
+ " is uppercase.");
} else {
System.out.println("The character " + aChar
+ " is lowercase.");
}
System.out.println("The value of aBoolean is "
+ aBoolean + ".");
}
}
50
Aritmética em programas Java
Operadores Aritméticos Binários
Operador
Uso
Descrição
+
op1 + op2
Adiciona op1 e op2; também usado para
concatenar
-
op1 - op2
Subtrai op2 de op1
*
op1 * op2
Multiplica op1 por op2
/
op1 / op2
Divide op1 por op2
%
op1 % op2
Computa o resto da divisão de op1 por op2
51
Aritmética em programas Java: Exemplo4
/* Fonte:
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/ex5/Arithmet
icDemo.java
*/
public class ArithmeticDemo {
public static void main(String[] args) {
//a few numbers
int i = 37;
int j = 42;
double x = 27.475;
double y = 7.22;
System.out.println("Variable values...");
System.out.println("
i = " + i);
System.out.println("
j = " + j);
System.out.println("
x = " + x);
System.out.println("
y = " + y);
//adding numbers
System.out.println("Adding...");
System.out.println("
i + j = " + (i + j));
System.out.println("
x + y = " + (x + y));
//subtracting numbers
System.out.println("Subtracting...");
System.out.println("
i - j = " + (i - j));
System.out.println("
x - y = " + (x - y));
52
Aritmética em programas Java: Exemplo4
//multiplying numbers
System.out.println("Multiplying...");
System.out.println("
i * j = " + (i * j));
System.out.println("
x * y = " + (x * y));
//dividing numbers
System.out.println("Dividing...");
System.out.println("
i / j = " + (i / j));
System.out.println("
x / y = " + (x / y));
//computing the remainder resulting from dividing numbers
System.out.println("Computing the remainder...");
System.out.println("
i % j = " + (i % j));
System.out.println("
x % y = " + (x % y));
//mixing types
System.out.println("Mixing types...");
System.out.println("
j + y = " + (j + y));
System.out.println("
i * x = " + (i * x));
}
}
53
Operadores relacionais
Operadores Relacionais
Operador Uso
Descrição
>
op1 > op2
Retorna true se op1 é maior do que op2
>=
op1 >= op2 Retorna true se op1 é maior ou igual à op2
<
op1 < op2
<=
op1 <= op2 Retorna true se op1 é menor ou igual à op2
==
op1 == op2 Retorna true se op1 e op2 são iguais
!=
op1 != op2
Retorna true se op1 é menor do que op2
Retorna true se op1 e op2 não são iguais
54
Operadores Condicionais
Ope radores Condicionais
Ope rador Uso
Descrição
&&
op1 && op2
Retorna true se op1 e op2 são ambos verdadeiros;
condicionalmente avalia op2
||
op1 || op2
Retorna verdadeiro se op1 ou op2 é verdadeiro;
condicionalmente avalia op2
!
!op
Retorna verdadeiro se op é falso
&
op1 & op2
Retorna true se op1 e op2 são ambos lógicos e ambos
verdadeiros; sempre avalia op1 e op2; se ambos são
números, realiza operação AND bit a bit.
|
op1 | op2
Retorna verdadeiro se ambos op1 e op2 são lógicos e
nenhum op1 ou op2 é verdadeiro; sempre avalia op1 e op2 ;
se ambos operandos são números, realiza a operação ou bit a
bit.
^
op1 ^ op2
Retorna verdadeiro se op1 e op2 são diferentes — isto é, se
um ou outro dos operandos, mas não ambos, é verdadeiro.
55
Operadores relacionais e condicionais:
Exemplo 5
public class RelationalDemo {
public static void main(String[]
//a few numbers
int i = 37;
int j = 42;
int k = 42;
System.out.println("Variable
System.out.println("
i = "
System.out.println("
j = "
System.out.println("
k = "
args) {
values...");
+ i);
+ j);
+ k);
//greater than
System.out.println("Greater than...");
System.out.println("
i > j is " + (i > j));
//false
System.out.println("
j > i is " + (j > i));
//true
System.out.println("
k > j is " + (k > j));
//false
//(they are equal)
//greater than or equal to
System.out.println("Greater
System.out.println("
i >=
System.out.println("
j >=
k >=
System.out.println("
than
j is
i is
j is
or equal to...");
" + (i >= j));
//false
" + (j >= i));
//true
" + (k >= j));
//true
56
Operadores relacionais e condicionais: Exemplo 5
//less than
System.out.println("Less
System.out.println("
i
System.out.println("
j
System.out.println("
k
than...");
< j is " + (i < j));
< i is " + (j < i));
< j is " + (k < j));
//true
//false
//false
//less than or equal to
System.out.println("Less
System.out.println("
i
System.out.println("
j
System.out.println("
k
than
<= j
<= i
<= j
equal to...");
" + (i <= j));
" + (j <= i));
" + (k <= j));
//true
//false
//true
//equal to
System.out.println("Equal to...");
System.out.println("
i == j is " + (i == j));
System.out.println("
k == j is " + (k == j));
//false
//true
//not equal to
System.out.println("Not equal to...");
System.out.println("
i != j is " + (i != j));
System.out.println("
k != j is " + (k != j));
//true
//false
or
is
is
is
}
}
57
Operadores relacionais e condicionais:
Exemplo 6
import java.util.Scanner;
public class Aritmética {
public static void main(String[] args) {
//Declaração de variáveis
float x1=0, x2=0, a=0, b=0, c=0, delta;
// cria um objeto Scanner
Scanner scannerKeyboard = new Scanner(System.in);
System.out.println("Calcula as raízes de uma eq. do 2 grau");
System.out.print("Please, enter with a:");
a= scannerKeyboard.nextFloat();
System.out.print("Please, enter with b:");
b= scannerKeyboard.nextFloat();
System.out.print("Please, enter with c:");
c= scannerKeyboard.nextFloat();
//calcula o valor de delta
delta = ((float)Math.pow(b,2)) - (4*a*c);
58
Operadores relacionais e condicionais:
Exemplo 6
/*
*
*
*
*/
if
verifica qual o tipo de raiz
delta > 0 - duas raízes reais distintas
delta = 0 - duas raízes reais e iguais
delta < 0 - raízes complexas
(delta == 0){
//
cálculo das raízes
x1= (-b - (float) Math.sqrt(delta))/(2*a);
x2= (-b + (float) Math.sqrt(delta))/(2*a);
//
Imprime resultado
System.out.printf("x1=%f x2=%f",x1,x2);
}else if (delta > 0 ){
//
cálculo das raízes
x1=(-b - (float) Math.sqrt(delta))/(2*a);;
x2= (-b + (float) Math.sqrt(delta))/(2*a);
// Imprime resultado
System.out.printf("x1=%7.3f x2=%7.3f",x1,x2);
59
Operadores relacionais e condicionais:
Exemplo 6
}else if (delta < 0){
//declaração de variáveis
float x1Real, x1Imag, x2Real, x2Imag;
// cálculo das raízes complexas
x1Real= -b /(2*a);
x1Imag = -(float) Math.sqrt(-1*delta)/(2*a);
//
x2Real = -b /(2*a);
x2Imag= ((float) Math.sqrt(-1*delta))/(2*a);
// Imprime resultado
System.out.println("\nRaizes complexas:");
System.out.printf("x1=%5.3f + %5.3fj",x1Real,x1Imag);
System.out.printf("\nx2=%5.3f - %5.3fj",x2Real,x2Imag);
}
}
}
60
Operadores relacionais e condicionais:
Exemplo 7
import java.util.Scanner;
public class Fatorial {
public static void main(String[] args) {
//
cria um objeto Scanner
Scanner scannerKeyboard = new Scanner(System.in);
// cria um objeto FatorialCalculate
FatorialCalculate fatCalculate = new FatorialCalculate();
// variáveis para o numero do fatorail a ser calculado e o
resutaldo
long number =0;
long result=0;
// pede e lê o númeor
System.out.print("\nPor favor, entre um número para
calcular o fatorial:");
number=scannerKeyboard.nextLong();
// chama o método fatorial de FatorialCalculate
result = fatCalculate.fatorial(number);
// imprime o resultado
System.out.printf("\nFatorial de %d ! = %d",number,result);
}
61
}
Operadores relacionais e condicionais:
Exemplo 7
public class FatorialCalculate {
// método que calcula o fatorial de forma recursiva
public long fatorial (long numero) {
/*
If(numero < 0){
System.out.println("Não existe fatorial
de número negativo");
System.exit(0);
}
*/
if (numero == 0)
return 1;
else
return numero * fatorial(numero-1);
}
62
Operadores relacionais e condicionais
Exercício:
- Crie um programa que calcule a potência de um
circuito monofásico e trifásico dado tensão, corrente e
fator de potência.
- Crie um programa que calcule o fator de potência
dado a potência trifásica, tensão de linha e corrente.
63
Classes e objetos
• Uma classe contém a descrição dos
estados e do comportamento de um
objeto.
• Um objeto é uma instância de uma classe.
• O estado de um objeto é descrito pelos
atributos.
• O comportamento é descrito pelos
métodos.
64
Classes e objetos
• Vários objetos podem ser instâncias de
uma mesma classe, mas estes objetos
são distintos e podem possuir estados
iguais ou diferentes.
• Mesmo que vários objetos tenham sido
instanciado de uma mesma classe, estes
objetos continuam sendo distintos, ainda
que o estado seja igual.
65
Classes e Objetos
Declaração do pacote
package biblioteca;
Biblioteca usadas
Declaração de classe
Variáveis (atributo)
Construtor
import java.util.Scanner;
public class Livro {
private String tituloLivro;
private String nomeAutor;
private String nomeEditora;
***
public Livro(String tituloLivro, String nomeAutor, ***) {
super();
this.tituloLivro = tituloLivro;
this.nomeAutor = nomeAutor;
this.nomeEditora = nomeEditora;
***
}
public void print() {
System.out.println("Titulo:" + tituloLivro);
System.out.println("Autor:" + nomeAutor);
System.out.println("Editora:" + nomeEditora);
}
Métodos
public String getIsbn() {
return this.isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
***
}
66
Variáveis (Atributos)
Elementos de Declaração de Variáveis
Função
Elemento
Visibilidade
(Optional) Nível de acesso para a variável:
private, public, protected
static
(Optional) Declara uma variável de classe
final
(Optional) Indica que o valor da variável não pode ser mudado
transient (Optional) Indica que o valor é transiente
volatile
(Optional) Indica que o valor é volátil
tipo nome O tipo e o nome da variável
67
Variáveis de Instância (Atributos)
package basic;
import java.util.Scanner;
public class MathComplex {
public static void main(String[] args) {
// Declaracao de variaveis simples
float real, imaginario;
// Declaracao de variaveis de instancia (entrada de dados)
Scanner keyboard = new Scanner(System.in);
// Imprime mensagem
System.out.println("Operacoes sobre numeros complexos");
// Le operando 1
System.out.println("Leitura do operando 1 ");
System.out.println("Entre com a parte real : ");
// Ler valor do teclado
real = keyboard.nextFloat();
// Imprime mensagem
System.out.println("Entre com a parte imag.:");
// Ler valor do teclado
imaginario = keyboard.nextFloat();
// Cria um objeto instanciado de ComplexNumber
// op1 é a variavel de instancia para este objeto
ComplexNumber op1 = new ComplexNumber(real, imaginario);
68
Variáveis de Instância (Atributos)
// Le operando 2
System.out.println("Leitura do operando 2 ");
System.out.println("Entre com a parte real : ");
// Ler valor do teclado
real = keyboard.nextFloat();
// Imprime mensagem
System.out.println("Entre com a parte imag.:");
// Ler valor do teclado
imaginario = keyboard.nextFloat();
// Cria um objeto instanciado de ComplexNumber
// op1 é a variavel de instancia para este objeto
ComplexNumber op2 = new ComplexNumber(real, imaginario);
// Realiza calculo
op1.add(op2);
//Imprime o resultado
System.out.println("\n\n\nResultado:");
op1.print();
}
}
69
Métodos
Nível de
acesso
Nome do
método
public ComplexNumber add(ComplexNumber cNumber)
Tipo de
retorno
Argumentos
70
Instruções de controle
Declarações de Fluxo de Controle
Tipo de declaração
Palavra-Chave
Laço
while, do-while, for
Tomada de decisão
if-else, switch-case
Manipulação de exceção try-catch-finally, throw
Saltos
break, continue, label:, return
71
Instruções de controle
Exemplo: Multiplicação de Matrizes
Primeiro
índice
0
1
2
3
4
5
6
7
8
índices
Elemento no índice 5
1
2
3
1
X
2
1
5
5
7
4
=
1
2
72
Instruções de controle
Exemplo: Multiplicação de Matrizes
// Le os elementos da matraiz A
for (int i=0; i < mB; i++)
for(int j=0; j < nB; j++){
System.out.printf("A[%d,%d]=",i,j);
matrizB[i][j]= keyboard.nextFloat();
}
// Realiza multiplicacao
for (int i = 0; i < mA; i++)
for (int j = 0; j < nB; j++)
for (int k = 0; k < nA; k++)
{
matrizC[i][j] = matrizC[i][j] + matrizA[i][k]
* matrizB[k][j];
}
73
Instruções de controle Exemplo: Biblioteca
package biblioteca;
import java.util.Hashtable;
public class GestaoBiblioteca {
public static void main(String[] args) {
Biblioteca biblioteca = new Biblioteca();
java.util.Scanner keyboard = new java.util.Scanner(System.in);
int escolha;
//
do {
printMenu();
escolha = keyboard.nextInt();
switch (escolha) {
case 0: // Novo
{
String tituloLivro, nomeAutor, nomeEditora, isbn, dataPublicacao;
float valorLivro;
//
System.out.println("Entre com o titulo do livro:");
tituloLivro = keyboard.next();
System.out.println("Entre com o nome do autor:");
nomeAutor = keyboard.next();
System.out.println("Entre com a editora:");
nomeEditora = keyboard.next();
74
Instruções de controle Exemplo: Biblioteca
System.out.println("Entre com o ISBN:");
isbn = keyboard.next();
System.out.println("Entre com a data de publicação:");
dataPublicacao = keyboard.next();
System.out.println("Entre com o valor do livro:");
valorLivro = keyboard.nextFloat();
Livro livro = new Livro(tituloLivro, nomeAutor,
nomeEditora,
isbn, dataPublicacao, valorLivro);
biblioteca.insertAcervo(livro);
}
break;
case 1: // Procurar
{
String isbn;
System.out.println("Entre com o ISBN do livro:");
isbn = keyboard.next();
Livro livro = biblioteca.localizarLivro(isbn);
if (livro == null) {
System.out.println("\nResultado: Livro com ISBN "
+ isbn + " nao foi encontrado");
} else {
System.out.println("\nResultado: Livro encontrado");
livro.print();
}
75
}
break;
Instruções de controle Exemplo: Biblioteca
case 2: // Excluir
{
String isbn;
isbn = keyboard.next();
boolean status = biblioteca.excluir(isbn);
if (status) {
System.out.println("Resultado: Livro com ISBN " + isbn
+ " foi excluido.");
} else {
System.out.println("Resultado: Livro com ISBN " + isbn
+ " nao pode ser excluido.");
}
}
break;
case 3: // Ajuda
{
System.out.println("Ajuda...");
}
break;
default: {
System.out.println("Opcao invalida...");
}
}
} while (escolha != 4);
}
76
Instruções de controle Exemplo: Biblioteca
public static void printMenu() {
System.out.println("\n\n\n\n---------------------------- ");
System.out.println("Sistema de gestão de biblioteca");
System.out.println("Menu:");
System.out.println("0 - Novo");
System.out.println("1 - Procurar");
System.out.println("2 - Excluir");
System.out.println("3 - Ajuda");
System.out.println("4 - Sair");
System.out.print("Escolha:_");
}
}
77
Instruções de controle Exemplo: Biblioteca
package biblioteca;
import java.util.Hashtable;
public class Biblioteca {
private Hashtable acervo;
public Biblioteca() {
this.acervo = new Hashtable();
}
public boolean insertAcervo(Livro livro) {
try {
if (!checkLivro(livro))
throw new Exception("Livro não pode ser nulo...");
acervo.put(livro.getIsbn(), livro);
} catch (Exception e) {
return false;
}
return true;
}
public Livro localizarLivro(String isbn) {
Object obj = acervo.get(isbn);
if (obj == null)
return null;
Livro livro = (Livro) obj;
return livro;
}
***
}
78
Instruções de controle Exemplo: Biblioteca
package biblioteca;
import java.util.Scanner;
public class Livro {
private String tituloLivro;
private String nomeAutor;
private String nomeEditora;
private String isbn;
private String dataPublicacao;
private float valorLivro;
public Livro(String tituloLivro, String nomeAutor, String nomeEditora,
String isbn, String dataPublicacao, float valorLivro) {
super();
this.tituloLivro = tituloLivro;
this.nomeAutor = nomeAutor;
this.nomeEditora = nomeEditora;
this.isbn = isbn;
this.dataPublicacao = dataPublicacao;
this.valorLivro = valorLivro;
}
public void print() {
System.out.println("Titulo:" + tituloLivro);
System.out.println("Autor:" + nomeAutor);
System.out.println("Editora:" + nomeEditora);
System.out.println("ISBN:" + isbn);
System.out.println("Data publicacao:" + dataPublicacao);
System.out.println("Valor:" + valorLivro);
}
public String getIsbn() {
return this.isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
79
***
}
Herança
Abstrações mais gerais
Veículo
Veículo Terrestre
Carro
Caminhão
Veículo Aéreo
Moto
Avião
Helicóptero
Extensão pela especialização
80
Herança
package veiculo;
public class Veiculo {
***
}
package veiculo;
public class VeiculoTerrestre extends Veiculo {
private int numeroRodas;
private boolean tracaoAnimal;
public VeiculoTerrestre(String nome, float velocidade, float peso,***) {
super(nome, velocidade, peso,***);
this.numeroRodas = numeroRodas;
this.tracaoAnimal = tracaoAnimal;
}
***
}
81
Herança
package veiculo;
public class Carro extends VeiculoTerrestre {
private String renavam;
private String placa;
private String proprietario;
private String fabricante;
public Carro(String fabricante, String nome, String renavam, ***) {
super(nome, velocidade, peso, ***);
this.renavam = renavam;
this.placa = placa;
this.proprietario = proprietario;
this.fabricante = fabricante;
}
***
}
82
Polimorfismo
• Polimorfismo permite programar no modo
geral em vez de programar no modo
específico.
• O polimorfismo permite que objetos que
possuam a mesma classe pai sejam
processadas como se fossem objetos
desta classe pai.
• Tipos de polimorfismo:
– Inclusão
– Sobrecarga
– Classes abstratas e concretas
83
Polimorfismo
• Inclusão
– Ocorre quando um método de uma classe filha
sobrepõe um método da classe pai.
– A sobrecarga é um polimorfismo, mas difere do
inclusão por possuir número ou tipo de
parâmetros diferentes.
– Podemos tratar um objeto de subclasse via
uma referência de sua superclasse.
– Não podemos tratar um objeto da superclasse
via uma referência de sua subclasse.
84
Polimorfismo
• Exemplo 1 (inclusão)
package polimorfismo.inclusao;
public class Father {
private String name;
public Father(String name) {
this.name = name;
}
public void print() {
System.out.println("Este método é da classe pai :" +
getName());
}
public String getName() {
return name;
}
}
85
Polimorfismo
• Exemplo 1 (inclusão)
package polimorfismo.inclusao;
public class Child1 extends Father {
public Child1(String name) {
super(name);
}
public void print() {
System.out.println("Este método é da classe filha :" + getName());
}
public void printOnlyHere() {
System.out.println("Este método é da classe filha :" + getName());
}
}
package polimorfismo.inclusao;
public class Child2 extends Father{
public Child2(String name) {
super(name);
}
}
86
Polimorfismo
• Exemplo 1 (inclusão)
package polimorfismo.inclusao;
public class TestInclusion {
public static void main(String[] args) {
Child1 child1 = new Child1("Test1");
Child2 child2 = new Child2("Test2");
Father father1 = (Father) new Child1("Test3");
Father father2 = new Father("Test4");
// Child1 child12 = father2; //Esta linha não é permitida
child1.print();
child2.print();
father1.print(); // invoca um método do objeto da subclasse
// via uma referência da superclasse
((Child1) father1).printOnlyHere(); // faz um downcasting para
// poder chamer o método printOnlyHere que é visivel somente
// somente para uma referencia da classe Child1
father2.print();
}
}
87
Polimorfismo
• Exemplo 2 (sobrecarga)
package polimorfismo.sobrecarga;
public class A {
private String name;
public A() {
name = "Default value";
}
public A(String name) {
this.name = name;
}
public void printName() {
System.out.println("Printing name:" + name);
}
public void printName(String name2) {
System.out.println("Printing name:" + name + " name 2:" + name2);
}
}
88
Polimorfismo
• Exemplo 2 (sobrecarga)
package polimorfismo.sobrecarga;
public class TestA {
public static void main(String[] args) {
A a = new A("Maria");
a.printName();
a.printName("Joao");
}
}
• Execução:
Printing name:Maria
Printing name:Maria name 2:Joao
89
Polimorfismo
• Classe abstrata e concreta
– As classes abstratas não podem ser diretamente
instanciadas. Elas devem ser herdadas por uma
classe (denominada concreta) que implementa
os métodos abstratos.
– A classe concreta é aquela que herda de uma
classe abstrata.
– Os métodos abstratos devem ser
implementados pela subclasse.
– Métodos da classe pai pode invocar um método
abstrato cuja implementação é fornecida pela
classe filha.
– Permite a programação em camadas.
90
Polimorfismo
• Exemplo (classe abstrata e concreta)
package polimorfismo.abstractSample;
public abstract class GenericDriver {
private String name;
public GenericDriver(){
name="default";
}
public GenericDriver(String name){
this.name = name;
}
public abstract void sendMessage(String message);
public abstract String receiveMessage();
public void readPrintMessage(){
System.out.printf("\nDriver %s> received: %s",name,receiveMessage());
}
public void writePrintMessage(String message){
System.out.printf("\nDriver %s> send message: %s",name,message);
sendMessage(message);
}
public String getName() {
return name;
}
}
91
Polimorfismo
• Exemplo (classe abstrata e concreta)
package polimorfismo.abstractSample;
public class WireLessDriver extends GenericDriver {
private String data;
public WireLessDriver(){
super("WireLessDriver");
}
@Override
public String receiveMessage() {
String number= Math.random() +" ";
return number;
}
@Override
public void sendMessage(String message) {
System.out.println("\n"+this.getName()+" >sending the message:"+message);
}
}
92
Polimorfismo
• Exemplo (classe abstrata e concreta)
package polimorfismo.abstractSample;
public class USBDriver extends GenericDriver {
private String data;
public USBDriver(){
super("USBDriver");
}
@Override
public String receiveMessage() {
String number= "00111000110001110111 ";
return number;
}
@Override
public void sendMessage(String message) {
System.out.println("\n"+this.getName()+" >sending the message:"+message);
}
}
93
Polimorfismo
• Exemplo (classe abstrata e concreta)
package polimorfismo.abstractSample;
public class TestDriver {
public static void main(String[] args) {
WireLessDriver wDriver = new WireLessDriver();
USBDriver usbDriver = new USBDriver();
wDriver.readPrintMessage();
wDriver.writePrintMessage("Message 1");
usbDriver.readPrintMessage();
usbDriver.writePrintMessage("Message 2");
}
}
94
Interface
• Uma interface define um protocolo de
comportamento que pode ser
implementado por uma classe.
• Define um conjunto de métodos, mas não
os implementa.
• Somente as classes implementam
métodos.
95
Interface
Nível de
acesso
Nome da interface
public interface NomeInterface <extends> <ParentInteface>{
public TipoRetorno NomeMetodo(argumentos);
***
}
Argumentos
Tipo de
retorno
Nome do método
96
Interface
package pckinterf;
public interface ItfCarro {
public void parar();
public void acelerar();
public void stabilizar(float velocidade);
public float getVelocidade();
public void estabelecerRota(String origem,String destino);
}
97
Interface
package pckinterf;
public class ControleSienaFire implements ItfCarro {
private String name;
private float velocidade;
public ControleSienaFire(String name) {
super();
this.name = name;
}
public void acelerar() {
this.velocidade = 60;
System.out.println("Carro " + name + " está acelerando...");
return;
}
public void estabelecerRota(String origem, String destino) {
System.out.println("Carro " + name + " está traçando nova rota de "
+ origem + " para " + destino);
return;
}
***
}
98
Interface
package pckinterf;
public class MainCarro {
public static void main(String[] args) {
ItfCarro carro = new ControleSienaFire("Siena");
carro.acelerar();
carro.getVelocidade();
carro.parar();
carro.stabilizar(90);
float velocidade = carro.getVelocidade();
System.out.println("Velocidade atual= " + velocidade);
}
}
99
Tratamento de exceção
• Uma exceção é uma indicação de um
problema na execução de um programa.
• O tratamento de exceções permite que o
programa se recupere de um problema e
não entre em um estado instável ou
inconsistente.
• Instruções para tratamento de exceções:
– try
– catch
– finally
100
Tratamento de exceção
• Exemplo 1 (Tratamento de Exceção pré-definido)
package exceptionSample;
public class DZeroException {
public static void main(String[] args) {
int a=6;
int b= 0;
int result= a/b;
System.out.println("Result:"+result);
}
}
• Execução
Exception in thread "main" java.lang.ArithmeticException: / by zero
at exceptionSample.DZeroException.main(DZeroException.java:8)
101
Tratamento de exceção
•package
Exemplo
2: Exceção
exceptionSample;
import java.util.Scanner;
public class DZeroExceptionHandled {
public static void main(String[] args) {
int a;
int b;
int result = 0;
boolean status = true;
Scanner keyboard = new Scanner(System.in);
do {
try {
System.out.println("Enter a:");
a = Integer.parseInt(keyboard.next());
System.out.println("Enter b:");
b = Integer.parseInt(keyboard.next());
result = a / b;
System.out.println("Result:" + result);
status = false;
} catch (ArithmeticException e) {
System.err.println("Exception is handled \n" + e);
System.err.println("Quotient cannot be zero");
System.err.println("Try again!");
} catch (NumberFormatException e2) {
System.err.println("Exception is handled \n" + e2);
System.err.println("Enter with an integer number!");
System.err.println("Try again!");
}
} while (status);
}
102
Tratamento de exceção
• Exemplo 3: Exceção
package exceptionSample;
public class MyException extends Exception {
public MyException() {
}
public MyException(String arg0) {
super(arg0);
}
public MyException(Throwable arg0) {
super(arg0);
}
public MyException(String arg0, Throwable arg1) {
super(arg0, arg1);
}
public String toString(){
return "MyException: "+ super.toString();
}
103
}
Tratamento de exceção
• Exemplo 3: Exceção
package exceptionSample;
public class Multiplication {
public float mult(float a, float b) throws MyException {
float result = a * b;
if (Float.isInfinite(result))
throw new MyException("The multiplication of " + a + " * " + b
+ " = infinity");
return result;
}
}
104
Tratamento de exceção
• Exemplo 3: Exceção
package exceptionSample;
public class TestMulti {
public static void main(String[] args) {
Multiplication mult = new Multiplication();
try{
float result = mult.mult((float)5.555e37, 44498f);
System.out.println("Result:"+ result);
}catch(Exception e){
System.out.println(e.toString());
}
}
}
• Execução
MyException: exceptionSample.MyException: The multiplication of 5.555E37
* 44498.0 = infinity
105
Programando com Threads
• Uma thread é uma linha de execução de
um programa.
Programa
Programa
Duas
threads
Uma
thread
106
Programando com Threads
• A programação usando várias threads permite a
realização de várias tarefas ao mesmo tempo
(paralelas).
• Exemplo de um thread em Java:
public class ClassName extends Thread {
public void run() {
// codigo do método run
return;
}
}
107
Programando com Threads
• Métodos da classe Thread:
–
–
–
–
run: primeiro método executado pela thread;
start: inicia a execução da thread;
join: espera pela finalização da execução da thread;
sleep: faz a thread “dormir” durante um tempo
determinado;
– isAlive: teste se a thread está “viva”
– setPriority: específica o nível de prioridade de execução:
• MAX_PRIORITY
• MIN_PRIORITY
• NORM_PRIORITY.
– setName: específica o nome da threa;
– getName: retorna o nome da thread.
108
Programando com Threads
• Ciclo de vida de uma thread
start
yield
sleep
0
1
run
2
“timeout-sleep”
3
4
fin
dispatch
0
4
Criada
1
Morta
2
Em execução
3
Suspendida/Bloqueada
Pronta para
execução
109
Programando com Threads:
Exemplo
package threadSample;
public class ClassThread extends Thread {
public ClassThread(String name) {
super(name);
}
public void run() {
for (long i = 0; i < 50; i++) {
System.out.printf("%s> Eu estou executando... valor de i=%d\n",
this.getName(), i);
}
return;
}
}
110
Programando com Threads:
Exemplo
package threadSample;
public class MainThread {
public static void main(String[] args) {
// Declaração de variáveis
ClassThread threadA = new ClassThread("Thread
ClassThread threadB = new ClassThread("Thread
ClassThread threadC = new ClassThread("Thread
ClassThread threadD = new ClassThread("Thread
ClassThread threadE = new ClassThread("Thread
A");
B");
C");
D");
E");
// Controlando a prioridade de execucao
threadA.setPriority(Thread.MIN_PRIORITY);
threadB.setPriority(Thread.MAX_PRIORITY);
threadC.setPriority(Thread.NORM_PRIORITY);
threadD.setPriority(Thread.NORM_PRIORITY);
threadE.setPriority(Thread.NORM_PRIORITY);
// Inicia a execucao dos threads
threadA.start();
threadB.start();
threadC.start();
threadD.start();
threadE.start();
111
Programando com Threads:
Exemplo
// Aguarda até que todos os threads tenham terminado
try {
threadA.join();
threadB.join();
threadC.join();
threadD.join();
threadE.join();
} catch (Exception e) {
System.out.println(e);
}
// Imprime mensagem final
System.out.println("Fim do programa principal");
}
}
112
Arquivos e fluxo
• O armazenamento de dados em arquivos
garante que os dados sejam persistentes
além da duração da execução do
programa.
• Os arquivos são gravados em memória
secundária como disco rígido, CDROM/CD-RW, fitas e memória flash.
• O termo fluxo de entrada/saída se refere a
dados ordenados que são lidos ou
escritos em um arquivo ou conexões de
rede.
113
Arquivos e fluxo
• Java permite duas formas de processamento de
arquivos:
– Seqüencial: processamento de arquivo texto ou arquivo
com objetos serializados;
– Acesso aleatório: processamento de arquivos binários.
• Segundo o tipo de arquivo, Java permite os
seguintes fluxos de entrada/saída:
– Para arquivo texto: fluxo baseados em caracteres;
– Para serialização de objetos: fluxo baseado em bytes;
– Para arquivos de acesso aleatório: fluxo baseado em
bytes (arquivo binário).
114
Arquivos e fluxo
• Manipulação de arquivos e diretórios em Java
são feitas usando a classe File.
– A biblioteca de java.io fornece a classe File:
•
•
•
•
•
•
•
•
•
•
•
public File(String pathname)
public boolean canRead()
public boolean canWrite()
public boolean delete()
public boolean exists()
public String getName()
public boolean isAbsolute()
public boolean isDirectory()
public boolean isFile()
public long length()
public boolean mkdir()
115
Arquivos e fluxo
• Exemplo:
•
Fonte: Deitel e Deitel, Java Como Programar, 6 ed, Pearson, 2006.
package fileSample;
import java.io.File;
public class FileDemonstration
{
// exibe informações sobre o arquivo que o usuário especifica
public void analyzePath( String path )
{
// cria o objeto File com base na entrada de usuário
File name = new File( path );
if (name.exists()) // se o nome existir, gera saída das informações sobre ele
{
// exibe informações sobre o arquivo (ou diretório)
System.out.printf(
"%s%s\n%s\n%s\n%s\n%s%s\n%s%s\n%s%s\n%s%s\n%s%s",
name.getName(), " exists",
( name.isFile() ? "is a file" : "is not a file" ),
( name.isDirectory() ? "is a directory" :
"is not a directory" ),
( name.isAbsolute() ? "is absolute path" :
"is not absolute path" ), "Last modified: ",
name.lastModified(), "Length: ", name.length(),
"Path: ", name.getPath(), "Absolute path: ",
116
name.getAbsolutePath(), "Parent: ", name.getParent());
Arquivos e fluxo
• Exemplo:
•
Fonte: Deitel e Deitel, Java Como Programar, 6 ed, Pearson, 2006.
if (name.isDirectory()) // listagem de diretório de saída
{
String directory[] = name.list();
System.out.println( "\n\nDirectory contents:\n" );
for ( String directoryName : directory )
System.out.printf( "%s\n", directoryName );
} // fim do else
} // fim do if externo
else // não for arquivo ou diretório, gera saída da mensagem de erro
{
System.out.printf( "%s %s", path, "does not exist." );
} // fim do else
} // fim do método analyzePath
} // fim da classe FileDemonstration
117
Arquivos e fluxo
• Execução
Enter file or directory name here: c:/temp
temp exists
is not a file
is a directory
is absolute path
Last modified: 1179521667235
Length: 0
Path: c:\temp
Absolute path: c:\temp
Parent: c:\
Directory contents:
hpjsilg2.txt
hponac01.log
hponiprint01.log
LESERC
118
Arquivos e fluxo
• Arquivo Texto: são usados as seguintes
classes de Java:
– FileInputStream: fornece um stream para
leitura de arquivos.
– InputStreamReader: é um stream de entrada
e leitura.
– BufferedReader: fornece um leitor com buffer.
– FileOutputStream: fornece um stream para
escrita de arquivos.
– PrintStream: fornece o recurso de formatação
para um stream de saída.
119
Arquivos e fluxo
• Exemplo de programa 1:
– WriteSequentialFile.java
package fileSample.senquentialB;
import java.io.*;
public class WriteSequentialFile {
public static void main(String[] args) {
try {
FileOutputStream fileOut = new FileOutputStream("fileSeq.txt");
PrintStream p = new PrintStream(fileOut);
System.out.println("Writing in a sequential file...");
p.println("Line 1: this is a sequential file");
p.println("Line 2");
p.println("Line 3");
p.println("Line 4");
p.println("Line 5");
p.printf("Line 5: %5.2f",56.44542213413234241f);
System.out.println("done...");
} catch (Exception e) {
System.out.println("erro:" + e.toString());
}
}
}
120
Arquivos e fluxo
• Exemplo de programa 1:
– ReadSequentialFile.java
package fileSample.senquentialB;
import java.io.*;
public class ReadSequentialFile {
public static void main(String[] args) {
try {
FileInputStream fileInputStream = new
FileInputStream("fileSeq.txt");
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(fileInputStream));
//
while (bufferedReader.ready()) {
System.out.println(bufferedReader.readLine());
}
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
121
Arquivos e fluxo
• Exemplo de programa 2:
– Contact.java
package fileSample.sequential;
public class Contact {
private String name;
private String address;
private String telefoneNumber;
public Contact(String name, String address, String telefoneNumber) {
super();
this.name = name;
this.address = address;
this.telefoneNumber = telefoneNumber;
}
public Contact() {
this(null, null, null);
}
public String getAddress() {
return address;
}
***
}
122
Arquivos e fluxo
• Exemplo de programa 2:
– WriteContact.java
package fileSample.sequential;
import java.util.Formatter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class WriteContact {
private java.util.Formatter output;
public void openFile() {
try {
BufferedReader dt = new BufferedReader(new
InputStreamReader(
System.in));
System.out.println("Entre com o nome do arquivo:");
String fileName = dt.readLine();
output = new Formatter(fileName);
} catch (Exception e) {
System.out.println("Erro:" + e.toString());
}
}
123
Arquivos e fluxo
• Exemplo de programa 2:
– WriteContact.java
public void addRecords() {
try {
BufferedReader dt = new BufferedReader(new InputStreamReader(
System.in));
String resp = "y";
while (resp.equals("y")) {
Contact contact = new Contact();
System.out.println("Please, enter with:");
System.out.println("Name:");
contact.setName(dt.readLine());
//
System.out.println("Address:");
contact.setAddress(dt.readLine());
//
System.out.println("Telephone:");
contact.setTelefoneNumber(dt.readLine());
//
output.format("%s #~ %s #~ %s $@\n", contact.getName(), contact
.getAddress(), contact.getTelefoneNumber());
//
System.out.println("Do you have a new contact (y/n)?");
resp = dt.readLine();
}
} catch (Exception e) {
System.out.println("Erro:" + e.toString());
}
}
124
Arquivos e fluxo
• Exemplo de programa 2:
– WriteContact.java
public void closeFile() {
if (output != null)
output.close();
}
}
125
Arquivos e fluxo
• Exemplo de programa 2:
– CreateTxt.java
package fileSample.sequential;
public class CreateTxt {
public static void main(String[] args) {
WriteContact wcontact = new WriteContact();
wcontact.openFile();
wcontact.addRecords();
wcontact.closeFile();
}
}
126
Arquivos e fluxo
• Exemplo de programa 2:
– ReadContact.java
package fileSample.sequential;
import
import
import
import
java.io.BufferedReader;
java.io.InputStreamReader;
java.util.StringTokenizer;
java.io.FileInputStream;
public class ReadContact {
private BufferedReader dtInput;
public void openContact() {
try {
dtInput = new BufferedReader(new InputStreamReader(
new FileInputStream("./file2.txt")));
} catch (Exception e) {
System.out.println(e.toString());
}
}
127
Arquivos e fluxo
• Exemplo de programa 2:
– ReadContact.java
package fileSample.sequential;
import
import
import
import
java.io.BufferedReader;
java.io.InputStreamReader;
java.util.StringTokenizer;
java.io.FileInputStream;
public class ReadContact {
private BufferedReader dtInput;
public void openContact() {
try {
dtInput = new BufferedReader(new InputStreamReader(
new FileInputStream("./file2.txt")));
} catch (Exception e) {
System.out.println(e.toString());
}
}
128
Arquivos e fluxo
• Exemplo de programa 2:
– ReadContact.java
public void readContacts() {
String data = "";
String delimAttribute = "#~";
String delimRecord = "$@";
//
try {
String resp = dtInput.readLine();
while (resp != null) {
StringTokenizer tokens = new StringTokenizer(resp, delimRecord);
while (tokens.hasMoreTokens()) {
String inf = tokens.nextToken();
StringTokenizer subtokens = new StringTokenizer(inf,
delimAttribute);
while (subtokens.hasMoreElements()) {
Contact contact = new Contact();
contact.setName(subtokens.nextToken());
contact.setAddress(subtokens.nextToken());
contact.setTelefoneNumber(subtokens.nextToken());
System.out.printf("%s - %s - %s\n", contact.getName(),
contact.getAddress(), contact
.getTelefoneNumber());
}
}
resp = dtInput.readLine();
}
} catch (Exception e) {
System.out.println("Erro:" + e.toString());
129
}
}
Arquivos e fluxo
• Exemplo de programa 2:
– ReadContact.java
public void closeFile() {
try {
if (dtInput != null) {
dtInput.close();
}
} catch (Exception e) {
System.err.print(e.toString());
}
}
}
130
Arquivos e fluxo
• Exemplo de programa 2:
– ReadTxt.java
package fileSample.sequential;
public class ReadTxt {
public static void main(String[] args) {
ReadContact readContact = new ReadContact();
readContact.openContact();
readContact.readContacts();
readContact.closeFile();
}
}
131
Arquivos e fluxo
• Exemplo 3:
– Serialização de objetos: Contact.java
package fileSample.objectStream;
import java.io.Serializable;
public class Contact implements Serializable {
static final long serialVersionUID = 12345433;
private String name;
private String address;
private int age;
private String telephone;
private String email;
public Contact(String name, String address, int age, String
telephone,
String email) {
this.name = name;
this.address = address;
this.age = age;
this.email = email;
this.telephone = telephone;
}
public String getAddress() {
return address;
}
***
}
132
Arquivos e fluxo
• Exemplo 3:
– Serialização de objetos: SaverContact.java
package fileSample.objectStream;
import
import
import
import
import
java.io.BufferedReader;
java.io.InputStreamReader;
java.io.File;
java.io.ObjectOutputStream;
java.io.FileOutputStream;
public class SaverContact {
public static void main(String[] args) {
// create a stream from keyboard
BufferedReader dt = new BufferedReader(new InputStreamReader(System.in));
try {
// declara as variaveis do contato
String name;
String address;
int age;
String telephone;
String email;
// Abre um arquivo
System.out.println("Entre com o nome do arquivo:");
String fileName = dt.readLine();
File file = new File(fileName);
***
133
System.out.println("Você quer inserir um contato?");
String option = dt.readLine();
Arquivos e fluxo
• Exemplo 3:
– Serialização de objetos: SaverContact.java
while (option.equals("Sim") || option.equals("sim")
|| option.equals("s") || option.equals("S")) {
// lê dados do contato
System.out.println("Entre com o Contato");
System.out.println("Entre com o nome:");
name = dt.readLine();
***
// cria um objeto Contato
Contact contact = new Contact(name, address, age, telephone,
email);
ObjectOutputStream oOutputStream = new ObjectOutputStream(
new FileOutputStream(file));
oOutputStream.writeObject(contact);
oOutputStream.flush();
System.out.println("Você quer inserir um contato?");
option = dt.readLine();
}
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
134
Arquivos e fluxo
• Exemplo 3:
– Serialização de objetos: RecoverContact.java
package fileSample.objectStream;
import
import
import
import
import
java.io.BufferedReader;
java.io.File;
java.io.InputStreamReader;
java.io.ObjectInputStream;
java.io.FileInputStream;
public class RecoverContact {
public static void main(String[] args) {
// create a stream from keyboard
BufferedReader dt = new BufferedReader(new InputStreamReader(System.in));
try {
// Abre um arquivo
System.out.println("Entre com o nome do arquivo:");
String fileName = dt.readLine();
File file = new File(fileName);
***
ObjectInputStream oInputStream = new ObjectInputStream(
new FileInputStream(file));
Object obj = oInputStream.readObject();
135
Arquivos e fluxo
• Exemplo 3:
– Serialização de objetos: RecoverContact.java
while (obj != null) {
if (obj instanceof Contact){
Contact contact = (Contact) obj;
// lê dados do contato
System.out.println("Contato:");
System.out.println("name:" + contact.getName());
System.out.println("address:" + contact.getAddress());
System.out.println("email:" + contact.getEmail());
}else throw new Exception(
"Não pode converter objetos... classes diferentes");
obj = oInputStream.readObject();
}
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
136
Arquivos e fluxo
• Arquivo de acesso aleatório
•Arquivos de acesso seqüencial são ineficientes para
aplicações que precisam acessar rapidamente as
informações.
•Em um arquivo de acesso aleatório, os dados (ou
campos) que compõem uma unidade de informação
constituem um registro.
•Um arquivo de acesso aleatório permite que um registro
possa ser acessado sem necessidade de percorrer
outros registros.
• Java não impõe uma estrutura de arquivo. O formato
do arquivo é definido pelo programador.
137
Arquivos e fluxo
• Arquivo de acesso aleatório
•Dentre os formatos de um arquivo de acesso aleatório,
pode-se especificar:
• Registros de tamanhos fixos.
• Cálculo da posição de um registro em função da
origem, posição do registro atual e da quantidade de
bytes ocupados por cada registro.
•Pode-se fixar o número máximo de registros de um
arquivo de acesso aleatório.
•A posição de um registro pode ser dada por um
indexador que pode ser um número inteiro (int) ou
um número inteiro longo (long).
138
Arquivos e fluxo
• Arquivo de acesso aleatório
•Exemplo de registro:
0
30 31
João Batista
campo
13
rua 5, Anil
60 61
Maria
campo campo
15
campo
Registro 1
rua 23, Anil
Carlos
campo campo
Registro 2
Cada campo tem um tamanho fixo, consequentemente, cada registro terá um
tamanho fixo. O tamanho de cada registro é medido em bytes.
139
Arquivos e fluxo
• Arquivo de acesso aleatório
•Para trabalhar em Java com arquivo de acesso
aleatório é necessário conhecer o tamanho de cada tipo
de dado.
Tipos de Dados Primitivos
Palavra-chaave Descrição
Tamanho
Inteiros
byte
Byte
1 byte
short
Short integer
2 bytes
int
Integer
4 bytes
long
Long integer
8 bytes
float
Ponto flutuante precisão simples
4 bytes
double
Ponto flutuante precisão dupla
8 bytes
char
Um único caractere
2 bytes - Unicode
boolean
Um valor lógico (true ou false) Um bit
String
Conjunto de caracteres
Números reais
Outros
Cada caracter tem 2 bytes
140
Arquivos e fluxo
• Arquivo de acesso aleatório
•As principais classes em Java para acesso aleatório
são:
•RandomAccessFile: suporta a escrita e leitura em
arquivos de acesso aleatório. Pode abrir arquivos
nos modos rw (leitura e escrita), r (somente leitura) e
w (somente escrita).
•Métodos:
•Leitura: readChar,
...,readUTF
readDouble,
readLong,
•Escrita: writeChar, WriteDoube, writeLong, ...,
writeUTF.
•Posicionamento: seek e seekLength
141
Arquivos e fluxo
Arquivo de acesso aleatório: Exemplo
Contact.java
package fileSample.random;
public class
public
public
public
public
Contact {
static final
static final
static final
static final
private
private
private
private
private
private
int
int
int
int
SIZE = 179;
NAME_LENGTH = 30;
ADDRESS_LENGTH = 45;
TELEPHONE_LENGTH = 10;
String name; // max. 30 caracteres
String address; // max. 45 caracteres
String telefoneNumber; // max. 10 caracteres
int age;
int recordNumber;
boolean status = false;
public Contact(String name, String address, String telefoneNumber, int age,int recordNumber) {
super();
this.name = name;
this.address = address;
this.telefoneNumber = telefoneNumber;
this.age = age;
this.recordNumber = recordNumber;
}
public Contact(int recordNumber) {
this("", "", "", 0, recordNumber);
}
public String getAddress() {
return address;
}
***
}
142
Arquivos e fluxo
• Arquivo de acesso aleatório: Exemplo
WriteContactRandom.java
package fileSample.random;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
public class WriteContactRandom {
private RandomAccessFile randomFile;
private int NUMBER_RECORDS = 100;
public void openFile() {
try {
BufferedReader dt = new BufferedReader(new InputStreamReader(
System.in));
System.out.println("Entre com o nome do arquivo:");
String fileName = dt.readLine();
randomFile = new RandomAccessFile(fileName, "rw");
} catch (Exception e) {
System.out.println("Erro:" + e.toString());
}
143
}
Arquivos e fluxo
• Arquivo de acesso aleatório: Exemplo
WriteContactRandom.java
public void initialize() throws java.io.IOException {
if (randomFile.length() != 0)
return;
//
for (int i = 0; i < NUMBER_RECORDS; i++) {
Contact contact = new Contact(i);
StringBuffer nameBuffer = new StringBuffer(Contact.NAME_LENGTH);
nameBuffer.setLength(Contact.NAME_LENGTH);
StringBuffer addressBuffer = new StringBuffer(
Contact.ADDRESS_LENGTH);
addressBuffer.setLength(Contact.ADDRESS_LENGTH);
StringBuffer telephoneBuffer = new StringBuffer(
Contact.TELEPHONE_LENGTH);
telephoneBuffer.setLength(Contact.TELEPHONE_LENGTH);
//
randomFile.writeInt(contact.getRecordNumber());
randomFile.writeChars(nameBuffer.toString()); // escreve nome
randomFile.writeChars(addressBuffer.toString()); // escreve nome
randomFile.writeChars(telephoneBuffer.toString()); // escreve nome
randomFile.writeInt(0); // escreve age
randomFile.writeBoolean(false); // estado do registro:
// false -> livre
// true -> ocupado
}
}
144
Arquivos e fluxo
• Arquivo de acesso aleatório: Exemplo
•
WriteContactRandom.java
public void addRecords() throws java.io.IOException {
BufferedReader dt = new BufferedReader(new InputStreamReader(System.in));
String resp = "y";
while (resp.equals("y")) {
System.out.println("Please, enter with:");
System.out.println("Record Number:");
int recordNumber = Integer.parseInt(dt.readLine());
// verify if recordNumber is valide
if (recordNumber > NUMBER_RECORDS) {
System.out.println("MAX record number must be "
+ (NUMBER_RECORDS - 1));
break;
} else if (recordNumber < 0) {
System.out
.println("MAX record number must be a positive number");
break;
}
//
Contact contact = new Contact(recordNumber);
//
// point to the position of the variable status in the file
randomFile.seek(Contact.SIZE * recordNumber + Contact.SIZE - 1);
//
read the status
boolean status = randomFile.readBoolean();
if (status) {
System.out.println("Registre is not empty.");
continue;
145
}
Arquivos e fluxo
• Arquivo de acesso aleatório: Exemplo
WriteContactRandom.java
System.out.println("Name:");
contact.setName(dt.readLine());
//
System.out.println("Address:");
contact.setAddress(dt.readLine());
//
System.out.println("Telephone:");
contact.setTelefoneNumber(dt.readLine());
//
System.out.println("Age:");
contact.setAge(Integer.parseInt(dt.readLine()));
//
StringBuffer nameBuffer = new StringBuffer(contact.getName());
nameBuffer.setLength(Contact.NAME_LENGTH);
StringBuffer addressBuffer = new StringBuffer(contact.getAddress());
addressBuffer.setLength(Contact.ADDRESS_LENGTH);
StringBuffer telephoneBuffer = new StringBuffer(contact
.getTelefoneNumber());
telephoneBuffer.setLength(Contact.TELEPHONE_LENGTH);
//
// point to the specified registry
randomFile.seek(Contact.SIZE * recordNumber);
146
Arquivos e fluxo
• Arquivo de acesso aleatório: Exemplo
WriteContactRandom.java
randomFile.writeInt(contact.getRecordNumber());
randomFile.writeChars(nameBuffer.toString()); // escreve nome
randomFile.writeChars(addressBuffer.toString()); // escreve nome
randomFile.writeChars(telephoneBuffer.toString()); // escreve nome
randomFile.writeInt(contact.getAge()); // escreve age
randomFile.writeBoolean(true);
//
System.out.println("Do you have a new contact (y/n)?");
resp = dt.readLine();
}
}
147
Arquivos e fluxo
• Arquivo de acesso aleatório
CreationBin.java
package fileSample.random;
public class CreateBin {
public static void main(String[] args) {
try {
WriteContactRandom wcontact = new WriteContactRandom();
wcontact.openFile();
wcontact.initialize();
wcontact.addRecords();
wcontact.closeFile();
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
148
Arquivos e fluxo
• Arquivo de acesso aleatório: Exemplo
ReadContactRandom.java
package fileSample.random;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
public class ReadContactRandom {
private RandomAccessFile randomFile;
private int NUMBER_RECORDS = 100;
// This constructor open a binary file with random access only for reading.
public void openContact() {
try {
BufferedReader dt = new BufferedReader(new InputStreamReader(
System.in));
System.out.println("Entre com o nome do arquivo:");
String fileName = dt.readLine();
randomFile = new RandomAccessFile(fileName, "r");
} catch (Exception e) {
System.out.println("Erro:" + e.toString());
}
}
149
Arquivos e fluxo
• Arquivo de acesso aleatório: Exemplo
ReadContactRandom.java
// read contacts from the specified file (randomFile)
public void readContacts() throws java.io.IOException {
BufferedReader dt = new BufferedReader(new InputStreamReader(System.in));
String resp = "y";
while (resp.equals("y")) {
System.out.println("Please, enter with:");
System.out.println("Record Number:");
int recordNumber = Integer.parseInt(dt.readLine());
if (recordNumber > NUMBER_RECORDS) {
System.out.println("MAX record number must be "
+ (NUMBER_RECORDS - 1));
break;
} else if (recordNumber < 0) {
System.out
.println("MAX record number must be a positive number");
break;
}
//
Contact contact = new Contact(recordNumber);
150
Arquivos e fluxo
• Arquivo de acesso aleatório: Exemplo
ReadContactRandom.java
//
// point to the position of the variable status in the file
randomFile.seek(Contact.SIZE * recordNumber + Contact.SIZE - 1);
// read the status
Boolean status = randomFile.readBoolean();
//
if (!status) {
System.out.println("Registre is empty.");
continue;
}
// point to the specified registry
randomFile.seek(Contact.SIZE * recordNumber);
System.out.println("Record number: " + randomFile.readInt());
//
// read name, address, ...
contact.setName(readString(randomFile,Contact.NAME_LENGTH));
//
contact.setAddress(readString(randomFile,Contact.ADDRESS_LENGTH));
//
contact.setTelefoneNumber(readString(randomFile,Contact.TELEPHONE_LENGTH));
//
contact.setAge(randomFile.readInt());
//
System.out.println("Name: " + contact.getName());
System.out.println("Address: " + contact.getAddress());
System.out.println("Telephone: " + contact.getTelefoneNumber());
System.out.println("Age: " + contact.getAge());
//
System.out.println("Do you like read another record (y/n):");
resp = dt.readLine();
151
}
}
Arquivos e fluxo
• Arquivo de acesso aleatório: Exemplo
ReadContactRandom
// read a string
public String readString(RandomAccessFile randomFile,int length) throws java.io.IOException{
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < length; i++)
buffer.append(randomFile.readChar());
String result = new String(buffer.toString().replace('\0', ' '));
return result;
}
}
152
Arquivos e fluxo
• Arquivo de acesso aleatório: Exemplo
ReadBin.java
package fileSample.random;
public class ReadBin {
public static void main(String[] args) {
try {
ReadContactRandom readContact = new ReadContactRandom();
readContact.openContact();
readContact.readContacts();
readContact.closeFile();
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
153
Programação em rede com Java
• Java é uma linguagem de programação
que permite a passagem de mensagens:
– Assíncronas.
– Síncronas.
• A passagem de mensagem assíncrona é
implementada pela utilização de
datagramas e socket.
• A passagem de mensagem síncrona é
obtida pela utilização de socket.
154
Programação em rede com Java
• Conceitos básicos para programação
em rede com Java:
– Noções básicas de rede (TCP, UDP e
Portas);
– URL (Uniform Resource Locator);
– IP (Internet Protocol)
155
Programação em rede com Java
• Os computadores em rede/Internet se comunicam
através de um protocolo chamado
TCP(Transmission Control Protocol) ou
UDP(User Datagram Protocol) .
Ordinateur A
Ordinateur B
Ordinateur C
Application
(HTTP, FTP, Telnet,…)
Application
(HTTP, FTP, Telnet,…)
Application
(HTTP, FTP, Telnet,…)
Transport
(TCP, UDP,...)
Transport
(TCP, UDP,...)
Transport
(TCP, UDP,...)
Network
(IP, …)
Network
(IP, …)
Network
(IP, …)
Link
(device driver,...)
Link
(device driver,...)
Link
(device driver,...)
156
Programação em rede com Java
•
•
A URL é um ponteiro para um recurso específico em um site particular na
Internet.
– Ex: http://www.dee.ufma.br
A sintaxe de uma URL pode ser definida por:
protocolo://nomeHost[ :porta]/caminho/nomeArquivo#seçãoArquivo
Protocolos:
– file: um arquivo:file://C:\JDBC_drivers\Javadoc\allclasses-frame.html)
– http: uma página Web ou um servidor Web (ex. :http://www.dee.ufma.br)
– ftp: um servidor FTP (par exemple :ftp://ftp.dee.ufma.br)
nomeHost: é um servidor (www.dee.ufma.br) que tem um recurso ou é um
endereço IP (ex.: 208.172.48.254). No caso de um nome de servidor, um
servidor de DNS(Domain Name System) é necessário para descobri o endereço
IP.
157
Programação em rede com Java
br
com
edu
fr
org
dee
www
ftp
pt
edu
com
ufma
deinf
www
Rede
interna
demat
ftp
Endereço
Interno
Endereço
externo
Rede
externa
158
Programação em rede com Java
protocolo://nomeHost[ :porta]/caminho/nomeArquivo#seçãoArquivo
porta : quando a porta é padronizada por um protocolo, ela é opcional. Por
exemplo, o protocolo HTTP usa a porta 80 (padrão).
As portas padrões estão registradas pelo IANA e são chamadas de Well Know
Ports (http://www.iana.org/assignments/port-numbers).
caminho: indica o local dentro de um diretório físico ou lógico no qual o
recurso pode ser encontrado.
nomeArquivo: específica o nome do arquivo que será baixado pela
aplicação cliente.
#seçãoArquivo: é um ponteiro dentro de um arquivo HTML.
Ex.: http://www.dee.ufma.br/~dlopes/Links.html#_Business_Process
159
Programação em rede com Java
IP (Internet Protocol) é uma camada de protocolo de rede
(network) do protocolo de comunicação TCP/IP.
Um endereço IP é utilizado para identificar uma máquina das
outras. Ex: 208.172.48.254.
Um endereço IP é representado por 32 bits (IPv 4).
O endereço IP é organizado em classes:
Classe
Numéro de Classe
A
1-127
Maximum
Réseau
127
de
Maximum
Hosts
16.777.214
B
129-191
16.383
65.534
C
192-223
2.097.151
254
de
160
Programação em rede com Java
.
Os endereços IPv4 são codificados em 32bits, seja
um total de 4.294.967.296 de endereços únicos
disponíveis.
Entretanto, estes números IPs não são suficientes
para atender a grande demanda. Por isso, criou-se
o IPv6.
O IPv6 tem 16 bytes (128bits) com o qual é possível
se criar 2128 endereços únicos.
161
Programação em rede com Java
O endereço IP somente assegura que o dado chegará à uma
máquina específica.
A porta assegura que o dado será enviado a uma aplicação
específica em execução na máquina com o endereço IP
especificado.
Application 1
Application 2
Application 3
Application N
Port 50
Port 80
Port 5050
Port 8000
TCP ou UDP
paquet
Port 50
donnée
paquet
Port 80
donnée
paquet
Port 5050
donnée
paquet
Port 8000
donnée
162
Programação em rede com Java
Um número de porta pode ser de 0 à 65535, pois as portas
são representada por 2 bytes (16 bits).
As portas de 0-1023 são registradas por serviços do sistema
operacional ou outros serviços específicos.
Estas portas (de 0 à 1023) são registradas pelo IANA e são
chamadas de Well Know Ports
(http://www.iana.org/assignments/port-numbers).
163
Programação em rede com Java:
Datagramas
Um datagrama é uma mensagem de um bloco
auto-contido (self-contained) enviado em
uma rede.
O tempo de chegado e a integridade do
conteúdo de um datagrama não são
garantidos.
Uma mensagem transmitida por datagramas é
completamente assíncrona, isto é, o cliente
e o servidor não precisam se sincronizar
para realizar a transmissão.
A ordem e a integridade da mensagem não 164
são asseguradas.
Programação em rede com
Java: Datagramas
• Biblioteca para datagramas:
– DatagramSocket: cria um socket para envio e
recebimento de pacotes de datagramas.
– DatagramPacket: representa um pacote de
datagrama que é usado para implementar um serviço de
transmissão de pacotes sem conexão.
165
Datagramas: Exemplo
// RECEIVER
int receiver_port = 6600; // port of server
DatagramSocket receiver_connection = null; // connection of type
// DatagramSocket (UDP)
byte[] buffer = new byte[256]; // create a buffer to receive the
// message
String msg_read = null;
try {
receiver_connection = new DatagramSocket(receiver_port);
DatagramPacket datagram = new DatagramPacket(buffer, buffer.length);
do {
// print message
System.out.println("Receiver>waiting...");
System.out.print("Receiver>");
receiver_connection.receive(datagram); // read from the
// datagramsocket (UDP)
msg_read = new String(datagram.getData(), 0, datagram
.getLength()); // transform the byte in String
System.out.println("message: [" + msg_read
+ "] from:" + datagram.getAddress().getHostName());
} while (!msg_read.equals("exit"));
} catch (Exception e) {
System.out.println("Exception in receiver...\nException:\n" + e);
}
receiver_connection.close();
166
Datagramas: Exemplo
//SENDER
int sender_port = 5000; // port of client
int receiver_port = 6600; // port of server
DatagramSocket sender_connection = null; // connection of type DatagramSocket (UDP)
String receiver_address = "leserc-03";
byte[] buffer = null;
Scanner keyboard = new Scanner(System.in);
String msg_keybd = null;
String msg_read=null;
try {
// create a DatagramSocket with port of client
sender_connection = new DatagramSocket(sender_port);
// create an object InetAddress (IP)
InetAddress server_inet = InetAddress.getByName(receiver_address);
do{
System.out.println("Sender>type a message...");
System.out.print("Sender>");
msg_keybd = (String) keyboard.next(); // read from keyboard
// get the bytes from the msg_keybd and put into the buffer
buffer = msg_keybd.getBytes();
// create a datagram packet
DatagramPacket datagram = new DatagramPacket(buffer, buffer.length,
server_inet, receiver_port);
// send the datagram packet to server
sender_connection.send(datagram);
167
Datagramas: Exemplo
//SENDER - continuação
// get the message from the datagram packet
msg_read = new String(datagram.getData());
System.out.println("Sender>sending message [" + msg_read + "] to :"
+ datagram.getAddress().getHostName());
}while(!msg_read.equals("exit"));
} catch (Exception e) {
System.out.println("Exception in sender...\nException:\n" + e);
}
sender_connection.close();
168
Programação em rede com Java:
Sockets
• Um socket é um ponto final (endpoint) de um canal
de comunicação de duas direções, entre dois
programas em execução na rede.
• Um socket é referenciado por um número de porta,
de maneira que a camada TCP possa identificar a
aplicação de destino.
• Socket é baseado no protocolo TCP que fornece
um canal ponto-à-ponto para as aplicações que
requerem um canal de comunicação confiável.
• A ordem e a integridade da mensagem transmitida
169
são asseguradas.
Programação em rede com
Java: Sockets
• A biblioteca para sockets:
– ServerSocket: esta classe permite criar um servidor de
sockets. Um servidor de sockets atende a uma
demanda de conexão via a rede.
– Socket: esta classe permite criar um client socket que é
um ponto final para a comunicação entre dois nós da
rede (computadores).
170
Sockets: Exemplo
Exemplo Server e
Client Socket
171
Sockets: Exemplo – Server.java
package socket;
import java.io.*;
import java.net.*;
public class Server {
public Server() {
super();
}
public static void main(String[] args) {
int server_port = 0; // port of server
int default_server_port = 6600; // default port of server
ServerSocket server_socket = null; // server socket
Socket socket_base = null; // base socket
String key = " ";
***
try {
server_socket = new ServerSocket(server_port);
// create a server socket
System.out.println("Server>server is listening in the port:"
+ server_port);
do {
socket_base = server_socket.accept(); // accept the
// connections
InetAddress inet_connected = socket_base.getInetAddress();
// get the InetAddress that originate the connection (client)
System.out
.println("Server>A new connection was established with "
+ inet_connected.getHostName()
+ "-> ip:"
+ inet_connected.getHostAddress()
+ " at port:"
+ socket_base.getPort());
System.out.println("Server>A new socket (at port:"
172
Sockets: Exemplo - Server.java
System.out.println("Server>A new socket (at port:"
+ socket_base.getLocalPort()
+ ") was created to handle this connection");
InputStream my_input = socket_base.getInputStream();
// get the input stream from connection
OutputStream my_output = socket_base.getOutputStream();
// get the output stream from connection
//
msg_receive = " ";
while (!msg_receive.equals("quit")
&& !msg_receive.equals("QUIT")) {
byte[] buffer_receive = new byte[1024]; // create a buffer
int size_msg = my_input.read(buffer_receive, 0,
buffer_receive.length);
// read from input stream (connection)
if (size_msg < 0)
throw new Exception(
"The connection was closed by the server...(size_msg < 0)");
msg_receive = new String(buffer_receive, 0, size_msg);
System.out.println("Server>server has received:"
+ msg_receive);
//
String msg_send = "Server have been received your message ["
+ msg_receive + "]";
byte[] buffer_send = msg_send.getBytes();
my_output.write(buffer_send, 0, buffer_send.length);
// write in output stream the message (connection)
my_output.flush();
}
} while (true);
} catch (Exception e) {
System.out.println("Exception in server...\nException:\n" + e);
***
}
173
}
Sockets: Exemplo – cliente.java
package socket;
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) {
int client_port = 0; // port of client
int server_port = 0; // port of server
Socket client_socket = null; // socket for client
String default_server_address = "127.0.0.1"; // default address
int default_server_port = 6600; // port of server
int default_client_port = 5600; // port of client
String server_address = null;
***
System.out.println("Client>starting client...");
String msg_kbd = " ";
try {
InetAddress inet_client = InetAddress.getLocalHost();
// create an InetAddress (IP)
client_socket = new Socket(InetAddress.getByName(server_address),
server_port, inet_client, client_port);
// create a socket
System.out.println("Client>client is using Host Name:"
+ inet_client.getHostName() + " with ip:"
+ inet_client.getHostAddress() + " and port:"
+ client_socket.getLocalPort());
InetAddress inet_connected = client_socket.getInetAddress();
// get the InetAddress of the server
System.out.println("Client>client is connected with Server:"
+ inet_connected.getHostName() + "-> ip:"
+ inet_connected.getHostAddress() + " at port:"
+ client_socket.getPort());
OutputStream my_output = client_socket.getOutputStream();
// get the output stream from the connection
BufferedReader dt = new BufferedReader(new InputStreamReader(
174
Sockets: Exemplo - cliente.java
// create a stream from keyboard
InputStream my_input = client_socket.getInputStream();
// get the input stream from the connection
while (!msg_kbd.equals("quit") && !msg_kbd.equals("QUIT")) {
msg_kbd = dt.readLine(); // read from keyboard
System.out.println("Client>sending message [" + msg_kbd + "]");
byte[] buffer_send = msg_kbd.getBytes();
// get the bytes of msg_kbd
my_output.write(buffer_send, 0, buffer_send.length);
// send the message to server
my_output.flush(); // force the sending of the message
//
byte[] buffer_receive = new byte[1024]; // create a buffer
int size_msg = my_input.read(buffer_receive, 0,
buffer_receive.length);
// read the message from server
if (size_msg < 0)
throw new Exception(
"The connection was closed by the server...(size_msg < 0)");
String msg_receive = new String(buffer_receive, 0, size_msg);
System.out.println("Client>The server " + server_address
+ " answered: " + msg_receive);
}
***
} catch (Exception e) {
System.out.println("Exception in client...\nException:\n" + e);
***
}
}
}
175
Coleções
Arrays
Collections
Lists, ArrayList, Iterator, LinkedList e Vector
Algoritmos de ordenação: sort, shuffle, busca
binária
Stack
PriorityQueue
176
Coleções
Uma coleção é um objeto que agrupa elementos
em uma única unidade.
Coleções são usadas para armazenar, recuperar,
manipular e comunicar usando dados
agregados.
Exemplos de coleções antes de Java 1.2: Vector,
HashTable e array.
Framework de coleções: é uma arquitetura para
representar e manipular coleções. Consiste em:
– Interfaces
– Implementações
– Algoritmos
177
Coleções
Benefícios na utilização de coleções:
– Reduz o esforço de programação;
– Aumenta a velocidade e qualidade de
programação;
– Permite interoperabilidade entre APIs;
– Reduz o esforço para aprender e usar uma
nova API;
– Reduz o esforço no projeto de uma nova API;
– Favorece o reuso de programas.
178
Coleções
As interfaces de coleções
Collection – o elemento raiz que representa um grupo de
objetos conhecidos como seus elementos.
Set – uma coleção que não contém elementos duplicados.
List – uma coleção ordenada podendo conter elementos
duplicados.
Queue – uma coleção usada para armazenar elementos
para um processamento. Pode ser FIFO (Fist Input Fist 179
Output).
Coleções
As interfaces de coleções
Map – mapeia um objeto a uma chave.
SortedSet – é uma Set que mantém seus elementos em
ordem crescente.
SortedMap – é um Map que mantém seus elementos em
ordem crescente.
180
Coleções
As implementações
Implementações de propósito geral
Implementations
Interfaces
Hash
table
Set
Resizable
array
HashSet
List
Tree
Linked list
TreeSet
ArrayList
Hash table + Linked
list
LinkedHashSet
LinkedList
Queue
Map
HashMap
TreeMap
LinkedHashMap
181
Coleções
Algoritmos:
• Sorting
• Shuffling
• Rotina de manipulação de dados:
– reverse, fill, copy, swap e addAll
• Algoritmos de busca
• Composição:
– Frequency
– disjoint
• Busca de valores extremos:
– min
– max
182
Coleções
• Sorting – o algoritmo de ordenação reordena Listas em
ordem crescente de acordo com um relacionamento de
ordenação.
• Suffling – o algoritmo destrói a ordem presente em uma
lista.
• Manipulação de dados – fornece cinco algoritmos para
minupalação de listas:
–
–
–
–
reverse: coloca os elementos da lista em uma ordem inversa;
fill: preenche a lista com um elemento;
Swap: troca a posição de dois elementos na lista.
addAll: adiciona determinados elementos na lista.
183
Coleções
• Busca
– Buscabinária busca por um elemento em específico
em uma lista ordenada.
• Composição:
– frequency: conta a quantidade de ocorrência de um
elemento em uma coleção.
– disjoint: determina o quanto duas coleções são
diferentes.
• Busca de valores extremos:
– min: retorna o elemento mínimo
– max: retorna o elemento máximo.
184
Coleções
• Arrays
– Armazenam elementos (dados) do mesmo tipo.
– A quantidade de elementos (dados) é especificada no
momento da criação do array.
– Os elementos de um array são armazenados
continuamente na memória.
– Impossível redimensionar o tamanho de um array.
– Exemplo:
• int name[ ] = {}
• int cars [ ] = new int[10];
185
Coleções
• java.util.Arrays.
– A classe Arrays fornece métodos para manipular
arrays:
• binarySearch – implementa a busca binária.
• equals – verifica se dois arrays são iguais.
• fill – preenche as posições de um array com o valor
especificado.
• sort – organiza os elementos de um array em ordem
crescente.
• Java.lang.System
– Esta classe contém o método arraycopy que
permite copiar um array em outro array.
186
Coleções
•
Exemplo de Arrays (fonte: Deitel, Java Como Programar, 6edição, 2006)
public class UsingArrays
{
private int intArray[] = { 1, 3, 2, 4, 5, 6 };
private double doubleArray[] = { 8.4, 9.3, 0.2, 7.9, 3.4 };
private int filledIntArray[], intArrayCopy[];
// constructor initializes arrays
public UsingArrays()
{
filledIntArray = new int[ 10 ]; // create int array with 10
elements
intArrayCopy = new int[ intArray.length ];
Arrays.fill( filledIntArray, 7 ); // fill with 7s
Arrays.sort( doubleArray ); // sort doubleArray ascending
// copy array intArray into array intArrayCopy
System.arraycopy( intArray, 0, intArrayCopy,
0, intArray.length );
} // end UsingArrays constructor
// output values in each array
public void printArrays()
{
System.out.print( "doubleArray: " );
for ( double doubleValue : doubleArray )
System.out.printf( "%.1f ", doubleValue );
***
187
} // end method printArrays
Coleções
•
Exemplo de Arrays (fonte: Deitel, Java Como Programar, 6edição, 2006)
// find value in array intArray
public int searchForInt( int value )
{
return Arrays.binarySearch( intArray, value );
} // end method searchForInt
// compare array contents
public void printEquality()
{
boolean b = Arrays.equals( intArray, intArrayCopy );
System.out.printf( "intArray %s intArrayCopy\n",
( b ? "==" : "!=" ) );
***
} // end method printEquality
public static void main( String args[] )
{
UsingArrays usingArrays = new UsingArrays();
usingArrays.printArrays();
usingArrays.printEquality();
int location = usingArrays.searchForInt( 5 );
if ( location >= 0 )
System.out.printf(
"Found 5 at element %d in intArray\n", location );
else
System.out.println( "5 not found in intArray" );
location = usingArrays.searchForInt( 8763 );
if ( location >= 0 )
System.out.printf(
"Found 8763 at element %d in intArray\n", location );
else
System.out.println( "8763 not found in intArray" );
188
} // end main
} // end class UsingArrays
Coleções
• Lista vinculada (Linked List)
PrimeiroNó
5
7
8
ÚltimoNó
3
elementos
Os nós de uma lista vinculada não são armazenados de forma contínua
na memória.
Sendo assim, um nó contém a referência para o próximo nó na memória.
Os elementos são acessados sequencialmente.
Vantagem -> armazena dados cuja quantidade é imprevisível.
189
Coleções
• Lista vinculada:
– Inserção de um novo elemento no início
PrimeiroNó
Novo nó
ÚltimoNó
PrimeiroNó
12
5
elementos
7
5
8
3
190
Coleções
• Lista vinculada:
– Inserção de um novo elemento no fim
ÚltimoNó
ÚltimoNó
PrimeiroNó
3
5
7
9
8
elementos
3
191
Coleções
• Lista vinculada:
– Métodos comuns:
• InserirNoComeço (insertAtFront) – insere um novo nó no
início da lista.
• InserirNoFim (insertAtBack) – insere um novo nó no fim da
lista.
• removerNoComeço (removeAtFront) – remove o primeiro nó
da lista.
• removerNoFim (removeAtBack) – remove o último nó da
lista.
192
Coleções
•
Exemplo de ArrayList e Iterator (fonte: Deitel, Java Como Programar, 6edição, 2006)
package collections;
import
import
import
import
java.util.List;
java.util.ArrayList;
java.util.Collection;
java.util.Iterator;
public class CollectionTest
{
private static final String[] colors =
{ "MAGENTA", "RED", "WHITE", "BLUE", "CYAN" };
private static final String[] removeColors =
{ "RED", "WHITE", "BLUE" };
// create ArrayList, add colors to it and manipulate it
public CollectionTest()
{
List< String > list = new ArrayList< String >();
List< String > removeList = new ArrayList< String >();
// add elements in colors array to list
for ( String color : colors )
list.add( color );
// add elements in removeColors to removeList
for ( String color : removeColors )
removeList.add( color );
System.out.println( "ArrayList: " );
// output list contents
for ( int count = 0; count < list.size(); count++ )
System.out.printf( "%s ", list.get( count ) );
// remove colors contained in removeList
removeColors( list, removeList );
193
System.out.println( "\n\nArrayList after calling removeColors: " );
Coleções
• Exemplo de lista (fonte: Deitel, Java Como Programar, 6edição, 2006)
// output list contents
for ( String color : list )
System.out.printf( "%s ", color );
} // end CollectionTest constructor
// remove colors specified in collection2 from collection1
private void removeColors(
Collection< String > collection1, Collection< String >
collection2 )
{
// get iterator
Iterator< String > iterator = collection1.iterator();
// loop while collection has items
while ( iterator.hasNext() )
if ( collection2.contains( iterator.next() ) )
iterator.remove(); // remove current Color
} // end method removeColors
public static void main( String args[] )
{
new CollectionTest();
} // end main
} // end class CollectionTest
194
Coleções
•
Exemplo de lista vinculada (fonte: Deitel, Java Como Programar, 6edição, 2006)
package collections;
import java.util.List;
import java.util.LinkedList;
import java.util.ListIterator;
public class ListTest
{
private static final String colors[] = { "black", "yellow",
"green", "blue", "violet", "silver" };
private static final String colors2[] = { "gold", "white",
"brown", "blue", "gray", "silver" };
// set up and manipulate LinkedList objects
public ListTest()
{
List< String > list1 = new LinkedList< String >();
List< String > list2 = new LinkedList< String >();
// add elements to list link
for ( String color : colors )
list1.add( color );
// add elements to list link2
for ( String color : colors2 )
list2.add( color );
list1.addAll( list2 ); // concatenate lists
list2 = null; // release resources
printList( list1 ); // print list1 elements
convertToUppercaseStrings( list1 ); // convert to uppercase
string
printList( list1 ); // print list1 elements
System.out.print( "\nDeleting elements 4 to 6..." );
removeItems( list1, 4, 7 ); // remove items 4-7 from list
printList( list1 ); // print list1 elements
printReversedList( list1 ); // print list in reverse order
} // end ListTest constructor
195
Coleções
•
Exemplo
de lista vinculada (fonte: Deitel, Java Como Programar, 6edição, 2006)
// output List contents
public void printList( List< String > list )
{
***
} // end method printList
// locate String objects and convert to uppercase
private void convertToUppercaseStrings( List< String > list )
{
ListIterator< String > iterator = list.listIterator();
while ( iterator.hasNext() )
{
String color = iterator.next(); // get item
iterator.set( color.toUpperCase() ); // convert to upper case
} // end while
} // end method convertToUppercaseStrings
// obtain sublist and use clear method to delete sublist items
private void removeItems( List< String > list, int start, int end )
{
list.subList( start, end ).clear(); // remove items
} // end method removeItems
// print reversed list
private void printReversedList( List< String > list )
{
ListIterator< String > iterator = list.listIterator( list.size() );
System.out.println( "\nReversed List:" );
// print list in reverse order
while ( iterator.hasPrevious() )
System.out.printf( "%s ", iterator.previous() );
} // end method printReversedList
public static void main( String args[] )
{
new ListTest();
} // end main
} // end class ListTest
196
Coleções
• Vetores:
– Fornece as capacidades de estruturas de dados no estilo array
que podem se redimensionar dinamicamente.
– A diferença entre ArrayList e Vector é que este último fornece
sincronização por padrão.
– Um Vector tem uma dimensão inicial e pode crescer de acordo
com um incremento pré-definido.
– O número de elemento que um Vector contém pode ser menor
que o número de posições reservadas.
– Métodos:
•
•
•
•
•
•
•
add: adicona um elemento no vetor.
contains: verifica se determinado elemento está contido no vetor.
indexOf: retorna a posição de um elemento no Vector.
Capacity: retorna a capacidade máxima atual de um Vector.
isEmpty: verifica se um Vector é vazio.
remove: remove um elemento de Vector.
size: retorna o número de elementos em um Vector.
197
Coleções
• Exemplo com Vector (fonte: Deitel, Java Como Programar, 6edição, 2006)
package collections;
import java.util.Vector;
import java.util.NoSuchElementException;
public class VectorTest
{
private static final String colors[] = { "red", "white", "blue" };
public VectorTest()
{
Vector< String > vector = new Vector< String >();
printVector( vector ); // print vector
// add elements to the vector
for ( String color : colors )
vector.add( color );
printVector( vector ); // print vector
// output the first and last elements
try
{
System.out.printf( "First element: %s\n", vector.firstElement());
System.out.printf( "Last element: %s\n", vector.lastElement() );
} // end try
// catch exception if vector is empty
catch ( NoSuchElementException exception )
{
exception.printStackTrace();
} // end catch
// does vector contain "red"?
198
Coleções
• Exemplo com Vector.
// does vector contain "red"?
if ( vector.contains( "red" ) )
System.out.printf( "\n\"red\" found at index %d\n\n",
vector.indexOf( "red" ) );
else
System.out.println( "\n\"red\" not found\n" );
vector.remove( "red" ); // remove the string "red"
System.out.println( "\"red\" has been removed" );
printVector( vector ); // print vector
// does vector contain "red" after remove operation?
if ( vector.contains( "red" ) )
System.out.printf(
"\"red\" found at index %d\n", vector.indexOf( "red" ) );
else
System.out.println( "\"red\" not found" );
// print the size and capacity of vector
System.out.printf( "\nSize: %d\nCapacity: %d\n", vector.size(),
vector.capacity() );
} // end VectorTest constructor
private void printVector( Vector< String > vectorToOutput )
{
if ( vectorToOutput.isEmpty() )
System.out.print( "vector is empty" ); // vectorToOutput is empty
else // iterate through the elements
{
System.out.print( "vector contains: " );
// output elements
for ( String element : vectorToOutput )
System.out.printf( "%s ", element );
} // end else
System.out.println( "\n" );
} // end method printVector
199
Coleções
• Exemplo com Vector.
public static void main( String args[] )
{
new VectorTest(); // create object and call its constructor
} // end main
} // end class VectorTest
200
Coleções
• Pilha (Stack)
– Métodos comuns:
• Empilhar (Push) – coloca um novo nó no topo da pilha.
• Desempilhar (Pop) – remove um nó do topo da pilha.
– Uma pilha é uma lista vinculada limitada, pois permite
inserir e remover um nó em uma das extremidades
conhecida como topo. A posição mais profunda de
uma lista aponta para Null indicando o final de uma
pilha.
Aponta para o topo
5
da pilha
7
8
Pilhas são estruturas de
dados do tipo LIFO (Last
Input First Output).
201
Coleções
•
Exemplo com java.util.Stack (fonte: Deitel, Java Como Programar, 6edição,
2006)
package dataStructure;
import java.util.Stack;
import java.util.EmptyStackException;
public class StackTest
{
public StackTest()
{
Stack< Number > stack = new Stack< Number >();
// create numbers to store in the stack
Long longNumber = 12L;
Integer intNumber = 34567;
Float floatNumber = 1.0F;
Double doubleNumber = 1234.5678;
// use push
stack.push(
printStack(
stack.push(
printStack(
stack.push(
printStack(
stack.push(
printStack(
method
longNumber ); // push a long
stack );
intNumber ); // push an int
stack );
floatNumber ); // push a float
stack );
doubleNumber ); // push a double
stack );
202
Coleções
• Exemplo com java.util.Stack.
// remove items from stack
try
{
Number removedObject = null;
// pop elements from stack
while ( true )
{
removedObject = stack.pop(); // use pop method
System.out.printf( "%s popped\n", removedObject );
printStack( stack );
} // end while
} // end try
catch ( EmptyStackException emptyStackException )
{
emptyStackException.printStackTrace();
} // end catch
} // end StackTest constructor
private void printStack( Stack< Number > stack )
{
if ( stack.isEmpty() )
System.out.print( "stack is empty\n\n" ); // the stack is empty
else // stack is not empty
{
System.out.print( "stack contains: " );
// iterate through the elements
for ( Number number : stack )
System.out.printf( "%s ", number );
System.out.print( "(top) \n\n" ); // indicates top of the stack
} // end else
} // end method printStack
public static void main( String args[] )
{
new StackTest();
} // end main
} // end class StackTest
203
Coleções
• Filas (Queue)
–
–
–
–
São estruturas de dados do tipo FIFO (First Input First Output).
Operações básicas: enfileiramento e desenfileiramento.
Utilizadas para suportar spooling de impressão.
As operações de uma fila:
• Enfileiramento corresponde a InserirNaFrente de uma lista;
• Desenfileiramento corresponde a RemoverNoFim de uma lista.
Primeiro Nó
ÚltimoNó
Inserir na Frente
5
elementos
7
Remover no Fim
8
3
204
Coleções
•
Exemplo com PriorityQueue (fonte: Deitel, Java Como Programar, 6edição,
2006)
package dataStructure;
import java.util.PriorityQueue;
public class PriorityQueueTest
{
public static void main( String args[] )
{
// queue of capacity 11
PriorityQueue< Double > queue = new PriorityQueue< Double >();
// insert elements to queue
queue.offer( 3.2 );
queue.offer( 9.8 );
queue.offer( 5.4 );
System.out.print( "Polling from queue: " );
// display elements in queue
while ( queue.size() > 0 )
{
System.out.printf( "%.1f ", queue.peek() ); // view top
element
queue.poll(); // remove top element
} // end while
} // end main
} // end class PriorityQueueTest
205
Coleções
• Árvores
– Listas vinculadas, pilhas e filas são estruturas de dados lineares.
– Uma árvore é uma estrutura de dados não linear, bidimensional e
com propriedades especiais.
– O nó raiz é o primeiro nó de uma árvore.
– Os nós de uma árvore contém dois ou mais links.
– Cada referência em um nó referencia um outro nó da árvore.
– Um nó que contém a referência de um outro nó é denominado nó
pai.
– Um nó que é referenciado por outro nó é denominado nó filho.
Nó raiz
Irmão do nó 9
Nó filho do raiz
5
7
9
2
Nó folha
Uma árvore binária
3
206
Coleções
• Set (fonte: Deitel, Java Como Programar, 6edição, 2006)
package dataStructure;
import java.util.List;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.Collection;
public class SetTest
{
private static final String colors[] = { "red", "white", "blue",
"green", "gray", "orange", "tan", "white", "cyan",
"peach", "gray", "orange" };
// create and output ArrayList
public SetTest()
{
List< String > list = Arrays.asList( colors );
System.out.printf( "ArrayList: %s\n", list );
printNonDuplicates( list );
} // end SetTest constructor
// create set from array to eliminate duplicates
private void printNonDuplicates( Collection< String > collection )
{
// create a HashSet
Set< String > set = new HashSet< String >( collection );
System.out.println( "\nNonduplicates are: " );
for ( String s : set )
System.out.printf( "%s ", s );
System.out.println();
} // end method printNonDuplicates
public static void main( String args[] )
{
new SetTest();
} // end main
} // end class SetTest
207
Coleções
• Mapas (fonte: Deitel, Java Como Programar, 6edição, 2006)
package dataStructure;
import java.util.StringTokenizer;
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
import java.util.TreeSet;
import java.util.Scanner;
public class WordTypeCount
{
private Map< String, Integer > map;
private Scanner scanner;
public WordTypeCount()
{
map = new HashMap< String, Integer >(); // create HashMap
scanner = new Scanner( System.in ); // create scanner
createMap(); // create map based on user input
displayMap(); // display map content
} // end WordTypeCount constructor
208
Coleções
• Mapas
// create map from user input
private void createMap()
{
System.out.println( "Enter a string:" ); // prompt for user
input
String input = scanner.nextLine();
// create StringTokenizer for input
StringTokenizer tokenizer = new StringTokenizer( input );
// processing input text
while ( tokenizer.hasMoreTokens() ) // while more input
{
String word = tokenizer.nextToken().toLowerCase(); // get
word
// if the map contains the word
if ( map.containsKey( word ) ) // is word in map
{
int count = map.get( word ); // get current count
map.put( word, count + 1 ); // increment count
} // end if
else
map.put( word, 1 ); // add new word with a count of 1 to
map
} // end while
} // end method createMap
209
Coleções
• Mapas
// display map content
private void displayMap()
{
Set< String > keys = map.keySet(); // get keys
// sort keys
TreeSet< String > sortedKeys = new TreeSet< String >( keys );
System.out.println( "Map contains:\nKey\t\tValue" );
// generate output for each key in map
for ( String key : sortedKeys )
System.out.printf( "%-10s%10s\n", key, map.get( key ) );
System.out.printf(
"\nsize:%d\nisEmpty:%b\n", map.size(), map.isEmpty() );
} // end method displayMap
public static void main( String args[] )
{
new WordTypeCount();
} // end main
} // end class WordTypeCount
210
Coleções
•
Algoritmos
– Classificação na ordem crescente (fonte: Deitel, Java Como Programar, 6edição, 2006)
package dataStructure;
import java.util.List;
import java.util.Arrays;
import java.util.Collections;
public class Sort1
{
private static final String suits[] =
{ "Hearts", "Diamonds", "Clubs", "Spades" };
// display array elements
public void printElements()
{
List< String > list = Arrays.asList( suits ); // create List
// output list
System.out.printf( "Unsorted array elements:\n%s\n", list );
Collections.sort( list ); // sort ArrayList
// output list
System.out.printf( "Sorted array elements:\n%s\n", list );
} // end method printElements
public static void main( String args[] )
{
Sort1 sort1 = new Sort1();
sort1.printElements();
} // end main
} // end class Sort1
211
Coleções
•
Algoritmos
– Classificação na ordem decrescente (fonte: Deitel, Java Como Programar, 6edição, 2006)
package dataStructure;
import java.util.List;
import java.util.Arrays;
import java.util.Collections;
public class Sort2
{
private static final String suits[] =
{ "Hearts", "Diamonds", "Clubs", "Spades" };
// output List elements
public void printElements()
{
List< String > list = Arrays.asList( suits ); // create List
// output List elements
System.out.printf( "Unsorted array elements:\n%s\n", list );
// sort in descending order using a comparator
Collections.sort( list, Collections.reverseOrder() );
// output List elements
System.out.printf( "Sorted list elements:\n%s\n", list );
} // end method printElements
public static void main( String args[] )
{
Sort2 sort2 = new Sort2();
sort2.printElements();
} // end main
} // end class Sort2
212
Coleções
•
Algoritmos
– reverse, fill, copy, max e min (fonte: Deitel, Java Como Programar, 6edição, 2006)
package dataStructure;
import java.util.List;
import java.util.Arrays;
import java.util.Collections;
public class Algorithms1
{
private Character[] letters = { 'P', 'C', 'M' };
private Character[] lettersCopy;
private List< Character > list;
private List< Character > copyList;
// create a List and manipulate it with methods from Collections
public Algorithms1()
{
list = Arrays.asList( letters ); // get List
lettersCopy = new Character[ 3 ];
copyList = Arrays.asList( lettersCopy ); // list view of
lettersCopy
System.out.println( "Initial list: " );
output( list );
Collections.reverse( list ); // reverse order
System.out.println( "\nAfter calling reverse: " );
output( list );
Collections.copy( copyList, list ); // copy List
System.out.println( "\nAfter copying: " );
output( copyList );
Collections.fill( list, 'R' ); // fill list with Rs
System.out.println( "\nAfter calling fill: " );
output( list );
} // end Algorithms1 constructor
213
Coleções
•
Algoritmos
– reverse, fill, copy, max e min
// output List information
private void output( List< Character > listRef )
{
System.out.print( "The list is: " );
for ( Character element : listRef )
System.out.printf( "%s ", element );
System.out.printf( "\nMax: %s", Collections.max( listRef ) );
System.out.printf( " Min: %s\n", Collections.min( listRef ) );
} // end method output
public static void main( String args[] )
{
new Algorithms1();
} // end main
} // end class Algorithms1
214
Componentes GUI
Introdução a SWING
215
Introdução a SWING
Uma interface gráfica com o usuário (GUI)
apresenta uma maneira amigável para o usuário
interagir com um sistema de software.
As GUI são compostas por elementos gráficos
denominados de controles ou widgets.
Java fornece algumas APIs para programação
com interface gráfica, dentre elas:
- AWT (Abstract Widget Toolkit).
- SWING.
Existem outras APIs para programação com
interface gráfica em Java, como o SWT
(Standard Widget Toolkit).
216
Introdução a SWING
Swing é um framework do tipo Model-ViewControl para Java.
As principais características de Swing:
–
–
–
–
–
–
Independência de plataforma;
Extensibilidade;
Orientado a componente;
Personalizável;
Configurável;
Uma interface gráfica de peso leve.
217
Introdução a SWING
Swing implementa o modelo MVC.
Controller
View
Model
218
Introdução a SWING
Hierarquia de classes de alguns componentes de Swing
Object
Component
Container
JComponent
219
Introdução a SWING
Alguns componentes de Swing:
JLabel: exibe texto não editável ou ícones;
JTextField: Permite ao usuário inserir dados do teclado. Também pode
ser utilizado para exibir texto editável ou não editável;
JButton: Desencadeia um evento quando o usuário clicar nele com o
mouse;
JCheckBox: Especifica uma opção que pode ou não ser selecionada;
JComboBox: fornece uma lista drop-down de itens a partir da qual o
usuário pode selecionar um dos itens, gerando um evento;
JList: fornece uma lista de itens a partir da qual o usuário pode fazer
uma seleção.
JPanel: fornece uma área em que os componentes podem ser
colocados e organizados.
220
Introdução a SWING
Exemplos
221
Applets
HTTP
Visão geral de HTML
Criação de Applets
222
HTTP
• O que é HTTP?
– HTTP (Hypertext Transfer Protocol) é
um protocolo de comunicação usado
para transferência de informação na
Web.
– No princípio, HTTP foi utilizado para
publicar e recuperar páginas HTML
(Hypertext Markup Language).
– W3C e IETF coordenaram o
desenvolvimento de HTTP (RFC2616).
223
HTTP
• O que é HTTP?
– HTTP é um protocolo do tipo
request/response (requisição/resposta)
entre clientes e servidores.
– HTTP é usado por um cliente
denominado browser como Internet
Explorer e Firefox.
– HTTP pode ser usado por outros
clientes como protocolo de
transferência.
224
HTTP
• O que é HTTP?
– HTTP usa a porta 80 por padrão.
– Os recursos acessados por HTTP são
identificados usando URIs (Uniforme
Resource Identifiers), especificamente URLs.
– HTTP possui um conjunto de métodos de
requisição:
• HEAD, GET, POST, PUT, DELETE, TRACE,
OPTIONS, CONNECT.
– HTTP possui também um conjunto de
códigos de estado.
225
HTTP
• Métodos de requisição:
– GET: requisita um recurso específico.
– HEAD: requisita uma resposta idêntica
a uma obtida por uma requisição GET,
mas sem um corpo de resposta.
– POST: submete um dado para ser
processado por um recurso. O dado é
submetido no corpo do método.
– PUT: Envia um recurso específico.
226
HTTP
• Métodos de requisição:
– DELETE: apaga o recurso especificado.
– TRACE: permite verificar os servidores
intermediários.
– OPTIONS: retorna os métodos HTTP
que são suportados pelo servidor.
– CONNECT: converte a conexão para
um túnel TCP/IP transparente,
geralmente para facilitar a comunicação
codificada por SSL (HTTPS).
227
HTTP
• Código de estado:
– Informativo:
• 1xx – Requisição recebida, continuando o
processamento.
• Tipos:
– 100 Continue: significa que o servidor recebeu
a requisição e o cliente deve enviar o corpo da
requisição.
– 101 Switching Protocols;
– 102 Processing.
228
HTTP
• Código de estado:
– Sucesso:
• 2xx – A ação foi recebida com sucesso,
entendia e aceita.
• Tipos:
– 200 OK: resposta padrão para indicar uma
requisição prontamente atendida.
– 201 Created
– 202 Accepted
– 204 No Content
– 205 Reset Content
– 206 Partial Content
229
HTTP
• Código de estado:
– Redirecionamento:
• 3xx – o cliente deve ter uma ação adicional
para completar a requisição.
• Tipos:
– 300 Multiple Choices
– 301 Moved Permanently
– 302 Found
230
HTTP
• Código de estado:
– Erro do cliente:
• 4xx – erro no cliente.
• Tipos:
– 400 Bad Request
– 401 Unauthorized
– 404 Not Found
– 415 Unsupported Media Type
231
HTTP
• Código de estado:
– Erro do servidor:
• 5xx – erro no servidor.
• Tipos:
– 500 Internal Server Error
– 501 Not implemented
– 502 Bad Gateway
– 505 HTTP Version Not Supported
232
HTML
• O que é HTML?
– HTML (Hyper Text Markup Language) é uma
linguagem utilizada para concepção de
páginas Web.
– HTML é uma linguagem que permite
descrever o conteúdo e a apresentação de
páginas Web.
– Uma página Web é lida e apresentada em
Web browsers (navegador), tais como
Internet Explorer, Mozilla e FireFox.
– HTML não é uma linguagem de programação.
233
– HTML foi criada a partir de SGML.
HTML
• O arquivo que contém a descrição de uma
página HTML tem geralmente a extensão
.htm ou .html.
• Um arquivo HTML é basicamente
constituído de:
– Texto e imagens.
– Balizas (por exemplo, <p> ... </p>) que
determinam a maneira como os elementos
serão apresentados no navegador.
234
HTML
• Algumas balizas permitem transformar um
texto ou uma imagem em um link
hypertexto (por exemplo, <a>...</a>).
• Exemplos de tags HTML:
– Determina o tamanho da fonte:
• <font size=“7”>
– Insere uma foto “JPEG”.
• <img src=“photo.jpg”>
235
Exemplo de HTML
HTML
Cabeçalho
Define o DTD de HTML
Define o tamanho do texto
Insere uma imagem
Corpo
Insere uma
enumeração
236
Exemplo de HTML
237
HTTP e HTML
1º
GET /index.html HTTP/1.1
HTTP/1.0 200 OK
4º
Página HTML
238
Applet
Applets são programas Java que podem ser incorporados a
documentos HTML.
Quando um navegado Web como Internet Explorer ou
Firefox carrega uma página da Web contendo um applet, o
navegador carrega o applet e o executa.
O navegador que executa o applet é denominado como
contêiner de applets.
Os applets são executados dentro do contêiner de acordo
com restrições do sandbox e a política de segurança.
239
Applet
Cada applet é uma interface gráfica em que se pode
colocar componentes gráficos, como listbox e buttons.
Os applets possuem um ciclo de vida determinado pelos
métodos:
•public void init(): chamado uma vez pelo contêiner
quando um applet é carregado para execução.
•public void start(): chamado pelo contêiner de applets
depois do método init() ter sido executado. O método
start é executado cada vez que a página Web é
invocada.
•public void paint(): chamado pelo contêiner de applets
depois dos métodos init e start. O método paint também
240
é chamado quando applet precisa ser repintado.
Applet
•public void stop(): este método é chamado pelo
contêiner de applets quando o usuário sai da página
Web do applet indo a outra página da Web. É chamado
quando o usuário escolhe navegar para uma outra
página.
•public void destroy(): este método é chamado pelo
contêiner quando o applet é removido da memória. Isto
ocorre quando o usuário fecha as janelas do navegador.
Um applet é implementado a partir de uma classe de
usuário que herda da classe JApplet e implementa os
métodos init, start, paint, stop e destroy.
241
Applet
Exemplos:
-HelloWordApplet.
-AdditionApplet.
<html>
<applet code = "WelcomeApplet.class" width = "300" height = "45">
</applet>
</html>
242
JNI (Java Native Interface)
Conceitos
Exemplos
243
JNI (Java Native Interface)
• JNI possibilita fazer a integração entre um
programa em Java com um serviço em
outra linguagem, outras APIs e outros
programas.
• JNI habilita:
– Um programa em Java fazer chamadas de
serviços em outras linguagens;
– Um serviço em outra linguagem fazer
chamadas de um programa em Java.
244
JNI (Java Native Interface)
• JNI define uma convenção padronizada de
nomes e chamadas que a máquina virtual de
Java pode utilizar para localizar e invocar
métodos nativos.
• JNI é construído dentro da máquina virtual de
Java a fim de poder invocar chamadas no
sistema local para suportar entrada e saída,
gráficos, rede e controle de threads diretamente
no sistema operacional hospedador.
245
JNI (Java Native Interface)
• Ilustração de JNI.
246
Fonte: http://java.sun.com/javase/technologies/index.jsp
JNI (Java Native Interface)
• Como funciona JNI.
Fonte: Sheng Liang, The Java Native Inteface - Programmer's Guide and
Specification, Addisson-Wesley, 2003.
247
JNI (Java Native Interface)
• JNI pode suportar dois tipos de código
nativo:
– Bibliotecas nativas: um programa em Java
que chama um método nativo;
– Aplicações nativas: uma aplicação nativa que
chama código em Java.
248
JNI (Java Native Interface)
• Usando bibliotecas nativas, JNI permite que
aplicações Java façam chamadas de funções
implementadas em bibliotecas nativas.
• Uma aplicação em Java chama métodos nativos
da mesma forma que se faz chamadas de
métodos na linguagem de programação Java.
• Métodos nativos são implementados em uma
outra linguagem e residem em bibliotecas
nativas.
• Exemplo:
– Um programa em Java pode fazer chamadas de
funções escritas em C.
249
JNI (Java Native Interface)
• Usando aplicações nativas,JNI suporta uma
invocação de interface que permite embutir a
máquina virtual de Java dentro de uma
aplicação nativa.
• Uma aplicação nativa é ligada a uma biblioteca
nativa que implementa a máquina virtual de
Java. Assim, a aplicação nativa usa uma
interface de invocação para executar o
componente de software escrito na linguagem
de progração Java.
• Exemplo:
•
Um programa em C pode fazer chamadas
de componentes de software em Java.
250
JNI (Java Native Interface)
• Implicações do uso de JNI:
– Perda de portabilidade;
– Perda da segurança e da utilização de tipos
seguros.
251
JNI (Java Native Interface)
• Quando se deve usar JNI:
– Uma aplicação Java deve conectar a um
sistema legado (legacy system);
– Para aumentar a performance de uma
aplicação em Java, codificando-se a parte
mais crítica dos algoritmos em aplicações
nativas;
252
JNI (Java Native Interface)
• Quando se deve usar JNI:
– Uma aplicação Java deve conectar a um
sistema legado (legacy system);
– Para aumentar a performance de uma
aplicação em Java, codificando-se a parte
mais crítica dos algoritmos em aplicações
nativas;
253
JNI (Java Native Interface)
• Utilizando JNI para chamar métodos nativos:
Criar uma classe
que declara
um método nativo
1
public class HelloWorld{
private native void print();
}
Usar javac para
compilar o
programa
2
HelloWorld.class
Usar javah para
gerar o arquivo de
cabeçalho
3
4
5
6
Executar o programa
HelloWold em Java
usando java.
Implementar o
método nativo na
linguagem escolhida.
Compilar o código e
gerar a biblioteca
nativa
HelloWorld.h
HelloWorld.c
HelloWorld.dll
Imprime:
“HelloWorld, I am implemented in C language”
254
JNI (Java Native Interface)
•
Descrição dos passos:
1. Criar uma classe (HelloWorld.java) que declare um
método nativo;
2. Usar javac para compilar o arquivo de código fonte
(HelloWorld.java);
3. Usar javah –jni para gerar os arquivos de
cabeçalho (HelloWorld.h) contendo o protótipo da
função para a implementação do método nativo.
4. Escrever a implementação em C (HelloWorld.c) do
método nativo.
5. Compilar a implementação em C, criando a
biblioteca nativa (em linux libHelloWorld.so ou em
windows HelloWorld.dll).
6. Executar o programa usando java e referenciando a
biblioteca nativa.
255
JNI (Java Native Interface)
• Exemplo:
package jniExample;
public class HelloWorld {
public native void print();
public static void main(String[] args) {
HelloWorld hello = new HelloWorld();
System.out.println("Hello World! I am a program in Java!");
System.out.println("I am calling a native method using JNI.");
hello.print();
}
static{
System.loadLibrary("HelloWorld");
}
}
256
JNI (Java Native Interface)
• Exemplo: HelloWorld.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jniExample_HelloWorld */
#ifndef _Included_jniExample_HelloWorld
#define _Included_jniExample_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:
jniExample_HelloWorld
* Method:
print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_jniExample_HelloWorld_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
257
JNI (Java Native Interface)
• Exemplo:
C:\Arquivos de programas\Java\jdk1.5.0_09\include
Arquivo gerado pelo comando "javah –jni HelloWorld"
#include <jni.h>
#include <stdio.h>
#include "jniExample_HelloWorld.h"
JNIEXPORT void JNICALL
Java_jniExample_HelloWorld_print(JNIEnv *env, jobject obj){
printf("Hello World! I am a program in C...");
return;
}
258
JNI (Java Native Interface)
• Arquivos de cabeçalho:
– jni.h - este cabeçalho fornece informações do
código nativo necessárias para chamar
funções JNI.
– stdio.h - o código que contém informações do
código de entrada e saída padrões usados na
linguagem C.
– HelloWorld.h - este cabeçalho foi gerado pelo
commando javah -jni HelloWorld
259
JNI (Java Native Interface)
•
Passos:
1. Compilar o código em Java:
javac -cp . jniExample/HelloWorld.java
2. Gerar arquivo de cabeçalho:
javah -jni jniExample.HelloWorld
3. Compilar o código em C:
$ gcc -mno-cygwin -I/cygdrive/c/[JAVAHOME]/include
-I/cygdrive/c/[JAVAHOME]/include/win32/ -Wl,--addstdcall-alias -shared -o HelloWorld.dll HelloWorld.c
Nota: O programa em C foi compilado usando gcc dentro do ambiente
Cygwin para windows.
260
JNI (Java Native Interface)
•
Gera o arquivo
HelloWorld.class
Exemplo dos Passos:
1.
$ javac -cp . jniExample/HelloWorld.java
2.
$ javah -jni jniExample.HelloWorld
Gera o arquivo
HelloWorld.h
3. $ gcc -mno-cygwin -I/cygdrive/c/TEMP/include I/cygdrive/c/TEMP/include/win32 -Wl,--add-stdcall-alias -shared -o
HelloWorld.dll HelloWorld.c
HelloWorld.c:8:2: warning: no newline at end of file
Gera o arquivo
HelloWorld.dll
4. $ java -cp . -Djava.library.path=. jniExample.HelloWorld
Hello World! I am a program in Java!
I am calling a native method using JNI.
Hello World! I am a program in C...
Executa o programa
HelloWorld usando a
biblioteca HelloWorld.dll
261
JNI (Java Native Interface)
– Usando Cygwin
262
JNI (Java Native Interface)
• Tipos de dados
263
JNI (Java Native Interface)
• Tipos de referências
264
JNI (Java Native Interface)
• Exemplo 2: JNIFatorial.java
package jniExample;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class JNIFatorial {
public static void main(String[] args) {
// create a BufferedReader object
BufferedReader dt = new BufferedReader(new InputStreamReader(System.in));
// create a FatorialCalculate object
JNIFatorialCalculate fatCalculate = new JNIFatorialCalculate();
//variables for the fatorial number to be calculated and the result
long number = 0;
long result = 0;
try {
// ask and read the value to be calculated
System.out
.print("\nPlease enter with a number to calculate the fatorial:");
number = Long.parseLong(dt.readLine());
// call the method fatorial from FatorialCalculate
result = fatCalculate.fatorial(number);
// print the results
System.out.printf("\nFatorial de %d = %d", number, result);
} catch (Exception e) {
System.out.println("\nErro:" + e);
}
265
}
}
JNI (Java Native Interface)
• Exemplo 2: JNIFatorialCalculate.java
package jniExample;
public class JNIFatorialCalculate {
//prototype for fatorial
public native long fatorial(long numero);
// load the library JNIFatorialCalculate
static{
System.loadLibrary("JNIFatorialCalculate");
}
}
266
JNI (Java Native Interface)
• Exemplo 2: jniExample_JNIFatorialCalculate.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jniExample_JNIFatorialCalculate */
#ifndef _Included_jniExample_JNIFatorialCalculate
#define _Included_jniExample_JNIFatorialCalculate
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:
jniExample_JNIFatorialCalculate
* Method:
fatorial
* Signature: (J)J
*/
JNIEXPORT jlong JNICALL Java_jniExample_JNIFatorialCalculate_fatorial
(JNIEnv *, jobject, jlong);
#ifdef __cplusplus
}
#endif
#endif
267
JNI (Java Native Interface)
• Exemplo 2: JNIFatorialCalculate.c
#include <jni.h>
#include <stdio.h>
#include "jniExample_JNIFatorialCalculate.h"
JNIEXPORT jlong JNICALL Java_jniExample_JNIFatorialCalculate_fatorial
(JNIEnv *env, jobject object, jlong number){
if(number < 0){
printf("Numero não pode ser negativo.");
exit(-1);
}
if (number == 0)
return 1;
else
return number * Java_jniExample_JNIFatorialCalculate_fatorial(env, object, number-1);
}
268
JNI (Java Native Interface)
•
Exemplo dos Passos:
Gera os arquivos *.class
–
$ javac -cp . jniExample/*.java
–
$ javah -jni jniExample.JNIFatorialCalculate
–
Gera o arquivo
3. $ gcc -mno-cygwin
JNIFatorialCalculate.dll
-I/cygdrive/c/[JAVAHOME]/include
-I/cygdrive/c/[JAVAHOME]/include/win32 -Wl,--add-stdcall-alias shared -o JNIFatorialCalculate.dll JNIFatorialCalculate.c
–
4. $ java -cp . -Djava.library.path=. jniExample.JNIFatorial
Gera o arquivo
jniExample_JNIFatorialCalculate.h
Please enter with a number to calculate the fatorial:5
Fatorial de 5 = 120
Executa o programa
JNIFatorial usando a
biblioteca
JNIFatorialCalculate.dll
269
JNI (Java Native Interface)
•
Usando Cygwin
270
JNI (Java Native Interface)
•
Exercício:
– Modifique o programa JNIFatorial para medir o
tempo de cálculo do fatorial em Java e compare
com o valor de tempo obtido com Java + JNI.
•
Para isto, use o método:
– System.nanoTime()
– Quais são as considerações com respeito a
esta comparação?
271
Download

Java - DEE - Universidade Federal do Maranhão