Anda di halaman 1dari 308

Programao Java SE 7

Guia do Aluno Volume II


D67238BP20
Edio 2.0
Abril de 2012
D77013
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Aviso de iseno
Este documento contm informaes de propriedade e protegido por leis de
direitos autorais e outras leis de propriedade intelectual. Voc pode copiar e imprimir
este documento exclusivamente para uso pessoal em um curso de treinamento da
Oracle. O documento no pode ser modificado ou alterado de forma alguma. Exceto
onde seu uso constitudo como "uso justo" sob a lei de direitos autorais, voc no
pode usar, compartilhar, baixar, fazer upload, copiar, imprimir, exibir, fazer uso,
reproduzir, publicar, licenciar, divulgar, transmitir nem distribuir este documento por
completo ou parcialmente sem a expressa autorizao da Oracle.
As informaes contidas neste documento esto sujeitas a alteraes sem aviso
prvio. Caso encontre quaisquer problemas no documento, relate-os por escrito para:
Oracle University, 500 Oracle Parkway, Redwood Shores, California 94065 USA.
Este documento no garante a iseno de erros.
Aviso sobre Direitos Restritos
Se essa documentao for entregue ao governo dos Estados Unidos ou a qualquer
pessoa que esteja utilizando o documento em nome do governo dos Estados Unidos,
o seguinte aviso ser aplicvel:
DIREITOS GOVERNAMENTAIS DOS EUA
Os direitos de uso, modificao, reproduo, liberao, execuo, exibio ou
divulgao do governo dos Estados Unidos destes materiais de treinamento so
restritos pelos termos do contrato de licena da Oracle aplicvel e/ou do contrato do
governo dos Estados Unidos aplicvel.
Aviso de Marca Comercial
Oracle e Java so marcas registradas da Oracle e/ou de suas afiliadas. Outros
nomes podem ser marcas comerciais de seus respectivos proprietrios.
Autores
Michael Williams
Tom McGinn
Matt Heimer
Colaboradores e
Revisores Tcnicos
Lee Klement
Steve Watts
Brian Earl
Vasily Strelnikov
Andy Smith
Nancy K.A.N
Chris Lamb
Todd Lowry
Ionut Radu
Joe Darcy
Brian Goetz
Alan Bateman
David Holmes
Editores
Richard Wallis
Daniel Milne
Vijayalakshmi Narasimhan
Designer Grfico
James Hans
Publicadores
Syed Imtiaz Ali
Sumesh Koshy
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Sumrio


1 Introduo
Objetivos do Curso 1-2
Objetivos do Curso 1-3
Pblico 1-5
Pr-requisitos 1-6
Apresentaes da Turma 1-7
Ambiente do Curso 1-8
Os Programas Java So Independentes de Plataforma 1-9
Grupos de Produtos de Tecnologia Java 1-10
Verses da Plataforma Java SE 1-11
Fazendo Download e Instalando o JDK 1-12
Java em Ambientes de Servidor 1-13
A Comunidade Java 1-14
O JCP (Java Community Process) 1-15
OpenJDK 1-16
Oracle Java SE Support 1-17
Recursos Adicionais 1-18
Resumo 1-19

2 Reviso de Sintaxe e Classe Java
Objetivos 2-2
Reviso da Linguagem Java 2-3
Estrutura de Classe 2-4
Uma Classe Simples 2-5
Blocos de Cdigo 2-6
Tipos de Dados Primitivos 2-7
Literais Numricos do Java SE 7 2-9
Literais Binrios do Java SE 7 2-10
Operadores 2-11
Strings 2-12
Operaes de String 2-13
if else 2-14
Operadores Lgicos 2-15
Arrays e Loop for-each 2-16
Loop for 2-17
Loop while 2-18
Instruo switch com String 2-19
Convenes de Nomeao Java 2-20
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Uma Classe Java Simples: Employee 2-21
Mtodos de Classe Employee 2-22
Criando uma Instncia de um Objeto 2-23
Construtores 2-24
Instruo package 2-25
Instrues import 2-26
Mais sobre import 2-27
Java Valor por Passagem 2-28
Valor por Passagem para Referncias de Objeto 2-29
Objetos Especificados como Parmetros 2-30
Como Compilar e Executar 2-31
Compilando e Executando: Exemplo 2-32
Carregador de Classe Java 2-33
Coleta de Lixo 2-34
Resumo 2-35
Quiz 2-36
Exerccio 2-1 Viso Geral: Criando Classes Java 2-39

3 Encapsulamento e Criao de Subclasses
Objetivos 3-2
Encapsulamento 3-3
Encapsulamento: Exemplo 3-4
Encapsulamento: Dados Privados, Mtodos Pblicos 3-5
Modificadores de Acesso Pblicos e Privados 3-6
Revisitando "Employee" 3-7
Nomeao de Mtodos: Melhores Prticas 3-8
Refinamento da Classe Employee 3-9
Tornar Classes o Mais Imutveis Possvel 3-10
Criando Subclasses 3-11
Criao de Subclasses 3-12
Subclasse Manager 3-13
Construtores No So Herdados 3-14
Usando super 3-15
Construindo um Objeto Manager 3-16
O Que Polimorfismo? 3-17
Sobrecarga de Mtodos 3-18
Mtodos Que Usam Argumentos Variveis 3-19
Herana nica 3-21
Resumo 3-22
Quiz 3-23
Exerccio 3-1 Viso Geral: Criando Subclasses 3-27
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
(Opcional) Exerccio 3-2 Viso Geral: Adicionando um Funcionrio
a um Gerente 3-28

4 Design de Classe Java
Objetivos 4-2
Usando Controle de Acesso 4-3
Controle de Acesso Protegido: Exemplo 4-4
Cpia de Sombra de Campo: Exemplo 4-5
Controle de Acesso: Prtica Recomendada 4-6
Substituindo Mtodos 4-7
Chamando um Mtodo Substitudo 4-9
Chamada de Mtodo Virtual 4-10
Acessibilidade de Mtodos Substitudos 4-11
Aplicando o Polimorfismo 4-12
Usando a Palavra-chave instanceof 4-14
Converso de Referncias de Objeto 4-15
Regras de Converso 4-16
Substituindo Mtodos de Objeto 4-18
Mtodo Object toString 4-19
Mtodo Object equals 4-20
Substituindo equals em Employee 4-21
Substituindo Object hashCode 4-22
Resumo 4-23
Quiz 4-24
Exerccio 4-1 Viso Geral: Substituindo Mtodos e Aplicando Polimorfismo 4-28

5 Design de Classe Avanado
Objetivos 5-2
Modelando Problemas de Negcios com Classes 5-3
Permitindo Generalizao 5-4
Identificando a Necessidade de Classes Abstratas 5-5
Definindo Classes Abstratas 5-6
Definindo Mtodos Abstratos 5-7
Validando Classes Abstratas 5-8
Quiz 5-9
Palavra-chave static 5-10
Mtodos Estticos 5-11
Implementando Mtodos Estticos 5-12
Chamando Mtodos Estticos 5-13
Variveis Estticas 5-14
Definindo Variveis Estticas 5-15
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Usando Variveis Estticas 5-16
Importaes Estticas 5-17
Quiz 5-18
Mtodos Finais 5-19
Classes Finais 5-20
Variveis Finais 5-21
Declarando Variveis Finais 5-22
Quiz 5-23
Quando Evitar Constantes 5-24
Enumeraes Typesafe 5-25
Uso de Enumerao 5-26
Enumeraes Complexas 5-27
Quiz 5-28
Padres de Design 5-29
Padro Singleton 5-30
Classes Aninhadas 5-31
Classe Interna: Exemplo 5-32
Classes Internas Annimas 5-33
Quiz 5-34
Resumo 5-35
Exerccio 5-1 Viso Geral: Aplicando a Palavra-chave Abstrata 5-36
Exerccio 5-2 Viso Geral: Aplicando o Padro de Design Singleton 5-37
Exerccio 5-3 Viso Geral: (Opcional) Usando Enumeraes Java 5-38
(Opcional) Exerccio 5-4 Viso Geral: Reconhecendo Classes Aninhadas 5-39

6 Herana com Interfaces Java
Objetivos 6-2
Substituio de Implementao 6-3
Interfaces Java 6-4
Desenvolvendo Interfaces Java 6-5
Campos de Constante 6-6
Referncias de Interface 6-7
Operador instanceof 6-8
Interfaces Marcadoras 6-9
Fazendo a Converso em Tipos de Interface 6-10
Usando Tipos de Referncia Genricos 6-11
Implementando e Estendendo 6-12
Estendendo Interfaces 6-13
Interfaces em Hierarquias de Herana 6-14
Quiz 6-15
Padres de Design e Interfaces 6-16
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Padro DAO 6-17
Antes do Padro DAO 6-18
Depois do Padro DAO 6-19
A Necessidade do Padro Factory 6-20
Usando o Padro Factory 6-21
O Mtodo Factory 6-22
DAO e Factory Juntos 6-23
Quiz 6-24
Reutilizao de Cdigo 6-25
Dificuldades de Design 6-26
Composio 6-27
Implementao da Composio 6-28
Polimorfismo e Composio 6-29
Quiz 6-31
Resumo 6-32
Exerccio 6-1 Viso Geral: Implementando uma Interface 6-33
Exerccio 6-2 Viso Geral: Aplicando o Padro DAO 6-34
(Opcional) Exerccio 6-3 Viso Geral: Implementando a Composio 6-35

7 Genricos e Colees
Objetivos 7-2
Genricos 7-3
Classe de Cache Simples sem Genricos 7-4
Classe de Cache Genrica 7-5
Genricos em Ao 7-6
Genricos com Inferncia de Tipos (Operador Diamante) 7-7
Quiz 7-8
Colees 7-9
Tipos de Coleo 7-10
Interface List 7-11
Classe de Implementao ArrayList 7-12
ArrayList Sem Genricos 7-13
ArrayList Genrica 7-14
ArrayList Genrica: Iterao e Boxing 7-15
Autoboxing e Unboxing 7-16
Quiz 7-17
Interface Set 7-18
Interface Set: Exemplo 7-19
Interface Map 7-20
Tipos Map 7-21
Interface Map: Exemplo 7-22
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Interface Deque 7-23
Pilha com Deque: Exemplo 7-24
Ordenando Colees 7-25
Interface Comparable 7-26
Comparable: Exemplo 7-27
Teste de Comparable: Exemplo 7-28
Interface Comparator 7-29
Comparator: Exemplo 7-30
Teste de Comparator: Exemplo 7-31
Quiz 7-32
Resumo 7-33
Exerccio 7-1 Viso Geral: Contando Nmeros de Pea por Meio de um
HashMap 7-34
Exerccio 7-2 Viso Geral: Fazendo a Correspondncia de Parnteses Usando
um Deque 7-35
Exerccio 7-3 Viso Geral: Contando Estoque e Classificando com
Comparators 7-36

8 Processamento de String
Objetivos 8-2
Argumentos de Linha de Comando 8-3
Propriedades 8-5
Carregando e Usando um Arquivo de Propriedades 8-6
Carregando Propriedades a Partir da Linha de Comando 8-7
PrintWriter e a Console 8-8
Formato printf 8-9
Quiz 8-10
Processamento de String 8-11
StringBuilder e StringBuffer 8-12
StringBuilder: Exemplo 8-13
Amostra de Mtodos de String 8-14
Usando o Mtodo split() 8-15
Analisando com StringTokenizer 8-16
Scanner 8-17
Expresses Regulares 8-18
Pattern e Matcher 8-19
Classes de Caractere 8-20
Classe de Caractere: Exemplos 8-21
Cdigo da Classe de Caractere: Exemplos 8-22
Classes de Caractere Predefinidas 8-23
Classe de Caractere Predefinida: Exemplos 8-24
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Quantificadores 8-25
Quantificador: Exemplos 8-26
Voracidade 8-27
Quiz 8-28
Objetos Matcher de Limite 8-29
Limite: Exemplos 8-30
Quiz 8-31
Correspondncia e Grupos 8-32
Usando o Mtodo replaceAll 8-33
Resumo 8-34
Exerccio 8-1 Viso Geral: Analisando Texto com split() 8-35
Exerccio 8-2 Viso Geral: Criando um Programa de Pesquisa de Expresso
Regular 8-36
Exerccio 8-3 Viso Geral: Transformando HTML com Expresses
Regulares 8-37

9 Excees e Asseres
Objetivos 9-2
Tratamento de Erros 9-3
Tratamento de Exceo na Java 9-4
A Instruo try-catch 9-5
Objetos de Exceo 9-6
Categorias de Exceo 9-7
Quiz 9-8
Tratando Excees 9-10
A Clusula finally 9-11
A Instruo try-with-resources 9-12
Excees Suprimidas 9-13
A Interface AutoCloseable 9-14
Capturando Vrias Excees 9-15
Declarando Excees 9-16
Tratando Excees Declaradas 9-17
Lanando Excees 9-18
Excees Personalizadas 9-19
Quiz 9-20
Excees Encapsuladoras 9-21
Revisitando o Padro DAO 9-22
Asseres 9-23
Sintaxe da Assero 9-24
Invariantes Internas 9-25
Invariantes de Fluxo de Controle 9-26
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Ps-condies e Invariantes de Classe 9-27
Controlando a Avaliao de Asseres em Runtime 9-28
Quiz 9-29
Resumo 9-30
Exerccio 9-1 Viso Geral: Capturando Excees 9-31
Exerccio 9-2 Viso Geral: Estendendo Exception 9-32

10 Fundamentos de E/S da Java
Objetivos 10-2
Noes Bsicas da E/S da Java 10-3
Fluxos de E/S 10-4
Aplicao de E/S 10-5
Dados Dentro de Fluxos 10-6
Mtodos InputStream de Fluxo de Bytes 10-7
Mtodos OutputStream de Fluxo de Bytes 10-9
Exemplo de Fluxo de Bytes 10-10
Mtodos Reader de Fluxo de Caracteres 10-11
Mtodos Writer de Fluxo de Caracteres 10-12
Exemplo de Fluxo de Caracteres 10-13
Encadeamento de Fluxos de E/S 10-14
Exemplo de Fluxos Encadeados 10-15
Processando Fluxos 10-16
E/S de Console 10-17
java.io.Console 10-18
Gravando na Sada Padro 10-19
Lendo na Entrada Padro 10-20
E/S de Canal 10-21
Exerccio 10-1 Viso Geral: Gravando uma Aplicao de E/S de Console
Simples 10-22
Persistncia 10-23
Serializao e Grficos de Objeto 10-24
Campos e Objetos Transientes 10-25
Transient: Exemplo 10-26
UID de Verso Serial 10-27
Exemplo de Serializao 10-28
Gravando e Lendo um Fluxo de Objetos 10-29
Mtodos de Serializao 10-30
Exemplo de readObject 10-31
Resumo 10-32
Quiz 10-33
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Exerccio 10-2 Viso Geral: Serializando e Desserializando um
ShoppingCart 10-37

11 E/S de Arquivo da Java (NIO.2)
Objetivos 11-2
Nova API de E/S de Arquivo (NIO.2) 11-3
Limitaes de java.io.File 11-4
Sistemas de Arquivos, Caminhos, Arquivos 11-5
Caminho Relativo x Caminho Absoluto 11-6
Links Simblicos 11-7
Conceitos do Java NIO.2 11-8
Interface Path 11-9
Recursos da Interface Path 11-10
Caminho: Exemplo 11-11
Removendo Redundncias de um Path 11-12
Criando um Subcaminho 11-13
Unindo Dois Caminhos 11-14
Criando um Caminho Entre os Dois Caminhos 11-15
Trabalhando com Links 11-16
Quiz 11-17
Operaes de File 11-20
Verificando um Arquivo ou Diretrio 11-21
Criando Arquivos e Diretrios 11-23
Deletando um Arquivo ou Diretrio 11-24
Copiando um Arquivo ou Diretrio 11-25
Copiando Entre um Fluxo e um Caminho 11-26
Movendo um Arquivo ou Diretrio 11-27
Listando o Contedo de um Diretrio 11-28
Lendo/Gravando Todos os Bytes ou Linhas em um Arquivo 11-29
Canais e ByteBuffers 11-30
Arquivos de Acesso Aleatrio 11-31
Mtodos de E/S em Buffer para Arquivos de Texto 11-32
Fluxos de Bytes 11-33
Gerenciando Metadados 11-34
Atributos de Arquivo (DOS) 11-35
Atributos de Arquivo DOS: Exemplo 11-36
Permisses da POSIX 11-37
Quiz 11-38
Exerccio 11-1 Viso Geral: Gravando uma Aplicao de Intercalao
de Arquivo 11-41
Operaes Recursivas 11-42
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Ordem de Mtodo FileVisitor 11-43
Exemplo: WalkFileTreeExample 11-46
Localizando Arquivos 11-47
Sintaxe e Padro do PathMatcher 11-48
PathMatcher: Exemplo 11-50
Classe Finder 11-51
Outras Classes teis do NIO.2 11-52
Movendo para NIO.2 11-53
Resumo 11-54
Quiz 11-55
Exerccio 11-2 Viso Geral: Cpia Recursiva 11-58
(Opcional) Exerccio 11-3 Viso Geral: Usando PathMatcher para Deletar
Recursivamente 11-59

12 Threading
Objetivos 12-2
Agendamento de Tarefas 12-3
Por Que o Threading Importante 12-4
A Classe Thread 12-5
Estendendo o Thread 12-6
Iniciando um Thread 12-7
Implementando Runnable 12-8
Executando Instncias de Runnable 12-9
Um Runnable com Dados Compartilhados 12-10
Um Runnable: Vrios Threads 12-11
Quiz 12-12
Problemas com Dados Compartilhados 12-13
Dados No Compartilhados 12-14
Quiz 12-15
Operaes Atmicas 12-16
Execuo Fora da Ordem 12-17
Quiz 12-18
A Palavra-chave volatile 12-19
Parando um Thread 12-20
A Palavra-chave synchronized 12-22
Mtodos synchronized 12-23
Blocos synchronized 12-24
Bloqueio do Monitor de Objeto 12-25
Detectando a Interrupo 12-26
Interrompendo um Thread 12-27
Thread.sleep() 12-28
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Quiz 12-29
Mtodos Thread Adicionais 12-30
Mtodos a Serem Evitados 12-31
Deadlock 12-32
Resumo 12-33
Exerccio 12-1 Viso Geral: Sincronizando o Acesso a Dados
Compartilhados 12-34
Exerccio 12-2 Viso Geral: Implementando um Programa com Vrios
Threads 12-35

13 Concorrncia
Objetivos 13-2
O Pacote java.util.concurrent 13-3
O Pacote java.util.concurrent.atomic 13-4
O Pacote java.util.concurrent.locks 13-5
java.util.concurrent.locks 13-6
Colees de Thread Seguro 13-7
Quiz 13-8
Sincronizadores 13-9
java.util.concurrent.CyclicBarrier 13-10
Alternativas de Threading de Alto Nvel 13-11
java.util.concurrent.ExecutorService 13-12
java.util.concurrent.Callable 13-13
java.util.concurrent.Future 13-14
Desligando um ExecutorService 13-15
Quiz 13-16
E/S Concorrente 13-17
Um Cliente de Rede com Thread nico 13-18
Um Cliente de Rede com Vrios Threads (Parte 1) 13-19
Um Cliente de Rede com Vrios Threads (Parte 2) 13-20
Um Cliente de Rede com Vrios Threads (Parte 3) 13-21
Um Cliente de Rede com Vrios Threads (Parte 4) 13-22
Um Cliente de Rede com Vrios Threads (Parte 5) 13-23
Paralelismo 13-24
Sem Paralelismo 13-25
Paralelismo Ingnuo 13-26
A Necessidade do Framework Fork-Join 13-27
Roubo de Trabalho 13-28
Um Exemplo de Thread nico 13-29
java.util.concurrent.ForkJoinTask<V> 13-30
Exemplo de RecursiveTask 13-31
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Estrutura compute 13-32
Exemplo de compute (Abaixo do Limite) 13-33
Exemplo de compute (Acima do Limite) 13-34
Exemplo de ForkJoinPool 13-35
Recomendaes do Framework Fork-Join 13-36
Quiz 13-37
Resumo 13-38
(Opcional) Exerccio 13-1 Viso Geral: Usando o Pacote
java.util.concurrent 13-39
(Opcional) Exerccio 13-2 Viso Geral: Usando o Framework Fork-Join 13-40

14 Criando Aplicaes de Banco de Dados com JDBC
Objetivos 14-2
Usando a API JDBC 14-3
Usando a Classe Driver de um Fornecedor 14-4
Principais Componentes da API JDBC 14-5
Usando um Objeto ResultSet 14-6
Juntando Tudo 14-7
Gravando Cdigo JDBC Porttil 14-9
A Classe SQLException 14-10
Fechando Objetos JDBC 14-11
A Construo try-with-resources 14-12
try-with-resources: Prtica No Recomendada 14-13
Gravando Consultas e Obtendo Resultados 14-14
Exerccio 14-1 Viso Geral: Trabalhando com o Banco de Dados Derby
e JDBC 14-15
ResultSetMetaData 14-16
Obtendo uma Contagem de Linhas 14-17
Controlando o Tamanho da Extrao de ResultSet 14-18
Usando PreparedStatement 14-19
Usando CallableStatement 14-20
O Que Uma Transao? 14-22
Propriedades ACID de Uma Transao 14-23
Transferindo sem Transaes 14-24
Transferncia Bem-sucedida em Transaes 14-25
Transferncia Malsucedida em Transaes 14-26
Transaes JDBC 14-27
RowSet 1.1: RowSetProvider e RowSetFactory 14-28
Usando RowSetFactory de RowSet 1.1 14-29
Exemplo: Usando JdbcRowSet 14-31
Objetos de Acesso a Dados 14-32
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
O Padro do Objeto de Acesso a Dados 14-33
Resumo 14-34
Quiz 14-35
Exerccio 14-2 Viso Geral: Usando o Padro do Objeto de Acesso
a Dados 14-39

15 Localizao
Objetivos 15-2
Por Que Localizar? 15-3
Uma Aplicao de Amostra 15-4
Locale 15-5
Resource Bundle 15-6
Arquivos de Resource Bundle 15-7
Arquivos de Resource Bundle de Amostra 15-8
Quiz 15-9
Inicializando a Aplicao de Amostra 15-10
Aplicao de Amostra: Loop Principal 15-11
O Mtodo printMenu 15-12
Alterando a Locale 15-13
Interface de Amostra com Francs 15-14
Formatar Data e Moeda 15-15
Inicializar Data e Moeda 15-16
Exibindo uma Data 15-17
Personalizando uma Data 15-18
Exibindo Moeda 15-19
Quiz 15-20
Resumo 15-21
Exerccio 15-1 Viso Geral: Criando uma Aplicao de Data Localizada 15-22
(Opcional) Exerccio 15-2 Viso Geral: Localizando uma Aplicao JDBC 15-23

A SQL Primer
Objetivos A-2
Usando SQL para Consultar o Banco de Dados A-3
Instrues SQL A-4
Instruo SELECT Bsica A-5
Limitando as Linhas a Serem Selecionadas A-7
Usando a Clusula ORDER BY A-8
Sintaxe da Instruo INSERT A-9
Sintaxe da Instruo UPDATE A-10
Instruo DELETE A-11
Instruo CREATE TABLE A-12
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Definindo Restries A-13
Incluindo Restries A-16
Tipos de Dados A-18
Eliminando uma Tabela A-20
Resumo A-21
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Excees e Asseres
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Objetivos
Aps concluir esta lio, voc ser capaz de:
Definir a finalidade das excees Java
Usar as instrues try e throw
Usar as clusulas catch, multi-catch e finally
Fechar automaticamente os recursos com uma instruo
try-with-resources
Reconhecer categorias e classes de exceo comuns
Criar excees personalizadas e recursos que podem ser
fechados automaticamente
Testar invariantes por meio de asseres
Programao Java SE 7 9 - 2
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Tratamento de Erros
As aplicaes encontraro erros durante a execuo. As
aplicaes confiveis devem tratar os erros com o mximo
de normalidade possvel. Erros:
Devem ser a exceo, e no o comportamento esperado
Devem ser resolvidos para criar aplicaes confiveis
Podem ocorrer como resultado dos bugs de aplicao
Podem ocorrer devido a fatores que esto fora do controle
da aplicao
Os bancos de dados esto se tornando inacessveis
Falha dos discos rgidos
Retornando um Resultado de Falha
Algumas linguagens de programao usam o valor de retorno de um mtodo para indicar se
um mtodo foi concludo com xito. Por exemplo, no exemplo int x = printf("hi");
da linguagem C, um valor negativo em x indicaria uma falha. Vrias funes de biblioteca
padro de C retornam um valor negativo aps a falha. O problema que o exemplo anterior
tambm poderia ser escrito como printf("hi");, em que o valor de retorno ignorado.
Na Java, a preocupao tambm a mesma; qualquer valor de retorno pode ser ignorado.
Quando um mtodo que voc est escrevendo na linguagem Java no executado com
xito, recomenda-se o uso dos recursos de gerao e tratamento de excees disponveis na
linguagem, em vez do uso dos valores de retorno.
Programao Java SE 7 9 - 3
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Tratamento de Exceo na Java
Quando as bibliotecas Java baseadas em recursos externos
forem usadas, o compilador solicitar que voc trate ou
declare as excees que podem ocorrer.
O tratamento de uma exceo significa que voc deve
adicionar um bloco de cdigos para tratar o erro.
A declarao de uma exceo significa que voc declara
que um mtodo pode no ser executado com xito.
A Regra de Tratamento ou Declarao
Vrias bibliotecas exigiro o conhecimento do tratamento da exceo. A saber:
E/S de Arquivo (NIO: java.nio)
Acesso a banco de dados (JDBC: java.sql)
O tratamento de uma exceo significa que voc usa uma instruo try-catch para
transferir o controle para um bloco de tratamento de exceo quando uma exceo ocorre. A
declarao de uma exceo significa adicionar uma clusula throws a uma declarao de
mtodo, indicando que o mtodo pode no ser executado de uma maneira especfica. Em
outras palavras, o tratamento significa que cabe a voc resolver o problema; j a declarao
significa que outra pessoa ficar encarregada de resolv-lo.
Programao Java SE 7 9 - 4
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
A Instruo try-catch
A instruo try-catch usada para tratar excees.
try {
System.out.println("About to open a file");
InputStream in =
new FileInputStream("missingfile.txt");
System.out.println("File open");
} catch (Exception e) {
System.out.println("Something went wrong!");
}
Esta linha ser ignorada
se a linha anterior no
conseguir abrir o arquivo.
Esta linha ser executada
somente se algo sair errado
no bloco try.
A Clusula catch
Quando ocorrer uma exceo dentro de um bloco try, a execuo ser transferida para o
bloco catch anexado. Qualquer linha dentro do bloco try que aparecer aps a exceo
ser ignorada e no ser executada. A clusula catch deve ser usada para:
Repetir a operao
Tentar uma operao alternativa
Sair e retornar normalmente
Evitar um bloco catch vazio. Englobar silenciosamente uma exceo no uma prtica
recomendada.
Programao Java SE 7 9 - 5
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Objetos de Exceo
Uma clusula catch recebe uma referncia a um objeto
java.lang.Exception. A classe java.lang.Throwable
a classe pai de Exception; ela descreve vrios mtodos
que voc pode usar.
try {
//...
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
Excees de Log
Quando algo errado ocorre na aplicao, a ao comum registrar o que aconteceu. Os
desenvolvedores da Java tm a opo de vrias bibliotecas de log, incluindo a Log4j da
Apache e a framework de log java.util. Embora essas bibliotecas de log estejam fora do
escopo deste curso, voc pode observar que IDEs como o NetBeans recomendam a
remoo de quaisquer chamadas para printStackTrace(). Isso acontece porque
aplicaes de produo devem usar uma biblioteca de log, em vez de imprimir mensagens
de depurao na tela.
Programao Java SE 7 9 - 6
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Categorias de Exceo
A classe java.lang.Throwable forma a base da hierarquia
de classes de exceo. Existem duas categorias principais de
excees:
Excees verificadas,
que devem ser tratadas
ou declaradas
Excees no
verificadas, que no so
geralmente tratadas ou
declaradas
Throwable
Error Exception
RuntimeException SQLException IOException
ArithmeticException FileNotFoundException
Lidando com as Excees
Quando um objeto Exception for gerado e passado para uma clusula catch, ele ser
instanciado de uma classe que representa o tipo especfico do problema que ocorreu. Essas
classes relacionadas a exceo podem ser classificadas em duas categorias: verificadas e
no verificadas.
Excees No Verificadas
java.lang.RuntimeException e java.lang.Error, e suas subclasses, so
categorizadas como excees no verificadas. Esses tipos de excees no devem ocorrer
normalmente durante a execuo da aplicao. Voc pode usar uma instruo try-catch
para descobrir a origem dessas excees, mas quando uma aplicao estiver pronta para
produo, o volume de cdigo restante referente a RuntimeException e respectivas
subclasses deve ser pequeno. As subclasses Error representam erros que voc no ser
capaz de corrigir, como a insuficincia de memria da JVM. Estas so as
RuntimeExceptions que voc possivelmente precisar diagnosticar e solucionar:
ArrayIndexOutOfBoundsException: Acessando um elemento de array que no
existe
NullPointerException: Usando uma referncia que no aponta para um objeto
ArithmeticException: Dividindo por zero
Programao Java SE 7 9 - 7
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Uma NullPointerException deve ser capturada por meio
de uma instruo
try-catch.
a. Verdadeiro
b. Falso
Programao Java SE 7 9 - 8
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Quais dos tipos a seguir so excees verificadas instancesof?
a. Error
b. Throwable
c. RuntimeException
d. Exception
Programao Java SE 7 9 - 9
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Tratando Excees
Voc sempre deve capturar o tipo mais especfico de exceo.
Vrios blocos catch podem ser associados a um nico try.
try {
System.out.println("About to open a file");
InputStream in = new FileInputStream("missingfile.txt");
System.out.println("File open");
int data = in.read();
in.close();
} catch (FileNotFoundException e) {
System.out.println(e.getClass().getName());
System.out.println("Quitting");
} catch (IOException e) {
System.out.println(e.getClass().getName());
System.out.println("Quitting");
}
A ordem importante. Voc
deve capturar as excees
mais especficas primeiro
(ou seja, as classes filho
antes das classes pai).
Excees Verificadas
Todas as classes que so subclasses de Exception, exceto RuntimeException e
respectivas subclasses, so consideradas excees verificadas. Voc deve tratar ou
declarar essas excees com uma instruo try ou throws. A documentao HTML da
Java API (Javadoc) descrever quais excees verificadas podem ser geradas por um
mtodo ou construtor, e por qu.
A captura do tipo mais especfico de exceo permite que voc escreva blocos catch
destinados a tratar tipos de erros muito especficos. Evite capturar o tipo bsico de
Exception, pois difcil criar um bloco catch com finalidade geral que possa resolver
todos os erros possveis.
Observao: As excees lanadas pela Java Persistence API (JPA) estendem
RuntimeException e so categorizadas como excees no verificadas. Essas excees
talvez precisem ser tratadas ou declaradas em cdigo pronto para produo, mesmo que o
compilador no solicite que voc faa isso.
Programao Java SE 7 9 - 10
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
A Clusula finally
InputStream in = null;
try {
System.out.println("About to open a file");
in = new FileInputStream("missingfile.txt");
System.out.println("File open");
int data = in.read();
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
try {
if(in != null) in.close();
} catch (IOException e) {
System.out.println("Failed to close file");
}
}
Voc sempre fechar
os recursos abertos.
Uma clusula finally executada, independentemente
de uma Exception ter sido gerada.
Fechando Recursos
Ao abrir recursos como arquivos ou conexes de banco de dados, voc sempre dever
fech-los quando eles no forem mais necessrios. A tentativa de fechar esses recursos
dentro do bloco try pode ser problemtica, pois voc pode acabar ignorando a operao de
fechamento. Um bloco finally sempre executado, independentemente da ocorrncia de
um erro durante a execuo do bloco try. Se o controle for para um bloco catch, o bloco
finally ser executado aps o bloco catch.
s vezes, a operao a ser executada no bloco finally pode resultar na gerao de uma
Exception. Nesse caso, voc talvez seja solicitado aninhar uma try-catch em um bloco
finally. Possivelmente, voc tambm aninhar try-catch dentro dos blocos try e
catch.
Programao Java SE 7 9 - 11
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
A Instruo try-with-resources
A Java SE 7 oferece uma nova instruo try-with-resources
que fechar os recursos automaticamente.
System.out.println("About to open a file");
try (InputStream in =
new FileInputStream("missingfile.txt")) {
System.out.println("File open");
int data = in.read();
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println(e.getMessage());
}
Recursos Que Podem Ser Fechados
A instruo try-with-resources pode eliminar a necessidade de um bloco finally
extenso. Os recursos abertos por meio da instruo try-with-resources sempre so
fechados. Qualquer classe que implementa java.lang.AutoCloseable pode ser usada
como recurso. Se um recurso tiver que ser fechado automaticamente, sua referncia dever
ser declarada dentro dos parnteses da instruo try.
Vrios recursos podero ser abertos se estiverem separados por ponto-e-vrgulas. Se voc
abrir vrios recursos, eles sero fechados na ordem oposta em que foram abertos.
Programao Java SE 7 9 - 12
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Excees Suprimidas
Se ocorrer uma exceo no bloco try de uma instruo try-
with-resources e outra exceo durante o fechamento dos
recursos, as excees resultantes sero suprimidas.
} catch (Exception e) {
System.out.println(e.getMessage());
for(Throwable t : e.getSuppressed()) {
System.out.println(t.getMessage());
}
}
Excees de Recurso
Se ocorrer uma exceo durante a criao do recurso AutoCloseable, o controle ir
imediatamente para um bloco catch.
Se ocorrer uma exceo no corpo do bloco try, todos os recursos sero fechados antes da
execuo do bloco catch. Se uma exceo for gerada durante o fechamento dos recursos,
ela ser suprimida.
Se o bloco try for executado sem excees, mas uma exceo for gerada durante o
fechamento de um recurso, o controle ir para um bloco catch.
Programao Java SE 7 9 - 13
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
A Interface AutoCloseable
O recurso em uma instruo try-with-resources deve
implementar:
java.lang.AutoCloseable
Novo no JDK 7
Pode lanar uma Exception
java.io.Closeable
Refatorado no JDK7 para estender AutoCloseable
Pode lanar uma IOException
public interface AutoCloseable {
void close() throws Exception;
}
AutoCloseable x Closeable
A documentao da Java API fala o seguinte sobre o mtodo AutoCloseable: "Observe
que, diferente do mtodo de fechamento de Closeable, este mtodo de fechamento no
precisa ser imutvel. Em outras palavras, se esse mtodo de fechamento for chamado mais
de uma vez, o efeito colateral possivelmente ser visvel, diferente de Closeable.close,
que no ter nenhum efeito se for chamado mais de uma vez. No entanto, os
implementadores dessa interface so altamente incentivados a tornar seus mtodos de
fechamento imutveis."
Programao Java SE 7 9 - 14
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Capturando Vrias Excees
A Java SE 7 oferece uma nova clusula multi-catch.
ShoppingCart cart = null;
try (InputStream is = new FileInputStream(cartFile);
ObjectInputStream in = new ObjectInputStream(is)) {
cart = (ShoppingCart)in.readObject();
} catch (ClassNotFoundException | IOException e) {
System.out.println("Exception deserializing " + cartFile);
System.out.println(e);
System.exit(-1);
}
Vrios tipos de exceo
so separados com uma
barra vertical.
Os Benefcios de multi-catch
s vezes, necessrio executar a mesma ao, independentemente de a exceo estar
sendo gerada. A nova clusula multi-catch reduz o volume de cdigo que voc deve
escrever, eliminando a necessidade de vrias clusulas catch com os mesmo
comportamentos
Outro benefcio da clusula multi-catch que ele torna menos provvel a tentativa de
captura de uma exceo genrica. A captura de Exception impede que voc observe
outros tipos de excees que possam ser geradas pelo cdigo adicionado posteriormente a
um bloco try.
As alternativas de tipo separadas por barras verticais podem no ter um relacionamento de
herana. Voc no pode listar FileNotFoundException e IOException em uma
clusula multi-catch.
A E/S de arquivo e a serializao de objeto so abordadas na lio Fundamentos de E/S da
Java.
Programao Java SE 7 9 - 15
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Declarando Excees
Voc pode declarar que um mtodo lanou uma exceo,
em vez de trat-la.
public static int readByteFromFile() throws IOException {
try (InputStream in = new FileInputStream("a.txt")) {
System.out.println("File open");
return in.read();
}
}
Observe a ausncia de
clusulas catch. A
instruo try-with-
resources est sendo
usada somente para
fechar recursos.
Usando a clusula throws, um mtodo pode declarar que lanou uma ou mais excees
durante a execuo. Se uma exceo for gerada durante a execuo do mtodo, essa
execuo ser interrompida e a exceo ser lanada ao chamador. Os mtodos substitutos
podem declarar as mesmas excees, menos excees ou excees mais especficas, mas
no excees adicionais ou mais genricas. Um mtodo pode declarar vrias excees com
uma lista separada por vrgulas.
public static int readByteFromFile() throws FileNotFoundException,
IOException {
try (InputStream in = new FileInputStream("a.txt")) {
System.out.println("File open");
return in.read();
}
}
Tecnicamente, no necessrio declarar FileNotFoundException, pois ela uma
subclasse de IOException, mas uma prtica recomendada.
Programao Java SE 7 9 - 16
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Tratando Excees Declaradas
As excees que os mtodos podem lanar ainda devem ser
tratadas. A declarao de uma exceo delega a tarefa de
trat-las a outra pessoa.
public static void main (String[] args) {
try {
int data = readByteFromFile();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
O mtodo que declarou
uma exceo
Tratando Excees
A aplicao sempre deve tratar suas excees. A adio de uma clusula throws a um
mtodo atrasa o tratamento da exceo. Na verdade, uma exceo pode ser lanada vrias
vezes na pilha de chamadas. Uma aplicao Java SE padro deve tratar quaisquer
excees antes que elas sejam lanadas a partir do mtodo main; do contrrio, o programa
corre o risco de ser encerrado de modo anormal. possvel declarar que main lance uma
exceo, mas a menos que voc esteja projetando programas para encerrar de modo
anormal, evite fazer isso.
Programao Java SE 7 9 - 17
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Lanando Excees
possvel lanar novamente uma exceo que j tenha sido
capturada. Observe que h uma clusula throws e uma
instruo throw.
public static int readByteFromFile() throws IOException {
try (InputStream in = new FileInputStream("a.txt")) {
System.out.println("File open");
return in.read();
} catch (IOException e) {
e.printStackTrace();
throw e;
}
}
Relanamento Preciso
A Java SE 7 suporta o relanamento do tipo de exceo preciso. O exemplo a seguir no
seria compilado com a Java SE 6 porque a clusula catch recebe uma Exception, mas o
mtodo lana uma IOException. Para obter mais informaes sobre o novo recurso de
relanamento preciso, consulte
http://download.oracle.com/javase/7/docs/technotes/guides/language/catch-
multiple.html#rethrow.
public static int readByteFromFile() throws IOException {
try {
InputStream in = new FileInputStream("a.txt");
System.out.println("File open");
return in.read();
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
Programao Java SE 7 9 - 18
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Excees Personalizadas
possvel criar classes de exceo personalizadas
estendendo Exception ou uma de suas subclasses.
public class DAOException extends Exception {
public DAOException() {
super();
}
public DAOException(String message) {
super(message);
}
}
As excees personalizadas nunca so lanadas pelas bibliotecas de classe Java padro.
Para tirar proveito de uma classe de exceo personalizada, voc mesmo deve lan-la. Por
exemplo:
throw new DAOException();
Uma classe de exceo personalizada pode substituir mtodos ou adicionar nova
funcionalidade. As regras de herana so idnticas, mesmo que o tipo de classe pai seja
uma exceo.
Como as excees capturam informaes sobre um problema ocorrido, talvez seja
necessrio adicionar campos e mtodos, dependendo do tipo de informao que precisa ser
capturado. Se uma string puder capturar todas as informaes necessrias, use o mtodo
getMessage() herdado por todas as classes Exception de Throwable. Qualquer
construtor Exception que recebe uma string a armazenar para ser retornada por
getMessage().
Programao Java SE 7 9 - 19
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Qual palavra-chave deve ser usada para adicionar uma
clusula a um mtodo afirmando que o mtodo pode produzir
uma exceo?
a. throw
b. thrown
c. throws
d. assert
Programao Java SE 7 9 - 20
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Excees Encapsuladoras
Para ocultar o tipo de exceo que est sendo gerado sem
englobar a exceo, use uma exceo encapsuladora.
public class DAOException extends Exception {
public DAOException(Throwable cause) {
super(cause);
}
public DAOException(String message, Throwable cause)
{
super(message, cause);
}
}
Obtendo a Causa
A classe Throwable contm um mtodo getCause() que pode ser usado para recuperar
uma exceo encapsuladora.
try {
//
} catch (DAOException e) {
Throwable t = e.getCause();
}
Programao Java SE 7 9 - 21
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Revisitando o Padro DAO
O padro DAO usa a abstrao (uma interface) para permitir a
substituio da implementao. Um DAO de arquivo ou banco
de dados deve lidar com as excees. A implementao do
DAO pode usar uma exceo encapsuladora para preservar a
abstrao e evitar o englobamento de excees.
public Employee findById(int id) throws DAOException {
try {
return employeeArray[id];
} catch (ArrayIndexOutOfBoundsException e) {
throw new DAOException("Error finding employee in DAO", e);
}
}
Excees do DAO
Um DAO baseado em arquivo deve lidar com as IOExceptions e um DAO baseado em
JDBC deve lidar com as SQLExceptions. Se esses tipos de excees tiverem sido
lanados por um DAO, qualquer cliente ser associado a uma implementao, e no a uma
abstrao. Modificando a interface do DAO e implementando as classes para lanar uma
exceo encapsuladora (DAOException), possvel preservar a abstrao e permitir que os
clientes saibam quando uma implementao do DAO encontrar um problema.
Programao Java SE 7 9 - 22
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Asseres
Use asseres para documentar e verificar as suposies
e a lgica interna de um nico mtodo:
Invariantes internas
Invariantes de fluxo de controle
Ps-condies e invariantes de classe
Usos inadequados de asseres
As asseres podem ser desativadas em runtime; portanto:
No use asseres para verificar os parmetros de um
mtodo pblico.
No use mtodos na verificao da assero que possam
causar efeitos colaterais.
Por Que Usar Asseres
Use as asseres para adicionar cdigo s aplicaes que garanta que a aplicao est
sendo executada conforme esperado. Usando as asseres, possvel testar vrias
condies de falha; se a falha for confirmada, voc encerrar a aplicao e exibir
informaes relacionadas depurao. As asseres no devero ser usadas se as
verificaes sempre tiverem que ser executadas, pois a verificao de asseres pode estar
desativada.
Programao Java SE 7 9 - 23
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Sintaxe da Assero
Esta a sintaxe de uma assero:
assert <expresso_booleana> ;
assert <expresso_booleana> : <expresso_do_detalhe> ;
Se <expresso_booleana> for avaliada como false, um
AssertionError ser lanado.
O segundo argumento convertido em string e usado como
texto descritivo na mensagem do AssertionError.
A instruo assert
As asseres combinam o mecanismo de tratamento de exceo da Java com o cdigo
executado condicionalmente. Este um exemplo de pseudocdigo do comportamento das
asseres:
if (AssertionsAreEnabled) {
if (condition == false) throw new AssertionError();
}
AssertionError uma subclasse de Error e, portanto, est na categoria das excees
no verificadas.
Programao Java SE 7 9 - 24
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Invariantes internas
O problema :
1 if (x > 0) {
2 // do this
3 } else {
4 // do that
5 }
A soluo :
1 if (x > 0) {
2 // do this
3 } else {
4 assert ( x == 0 );
5 // do that, unless x is negative
6 }
Programao Java SE 7 9 - 25
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Invariantes de Fluxo de Controle
Exemplo:
1 switch (suit) {
2 case Suit.CLUBS: // ...
3 break;
4 case Suit.DIAMONDS: // ...
5 break;
6 case Suit.HEARTS: // ...
7 break;
8 case Suit.SPADES: // ...
9 break;
10 default: assert false : "Unknown playing card suit";
11 break;
12 }
Programao Java SE 7 9 - 26
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Ps-condies e Invariantes de Classe
Exemplo:
1 public Object pop() {
2 int size = this.getElementCount();
3 if (size == 0) {
4 throw new RuntimeException("Attempt to pop from empty stack");
5 }
6
7 Object result = /* code to retrieve the popped element */ ;
8
9 // test the postcondition
10 assert (this.getElementCount() == size - 1);
11
12 return result;
13 }
Programao Java SE 7 9 - 27
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Controlando a Avaliao de Asseres em Runtime
Se a verificao de asseres estiver desativada, o cdigo
ser executado na mesma velocidade que teria sido se a
verificao no estivesse l.
As verificaes de assero so desativadas por padro.
Ative as asseres com um dos seguintes comandos:
java -enableassertions MyProgram
java -ea MyProgram
A verificao de asseres pode ser controlada com base
em classe, pacote e hierarquia de pacotes. Consulte:
http://download.oracle.com/javase/7/docs/technotes/guides/
language/assert.html
Programao Java SE 7 9 - 28
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
As asseres devem ser usadas para executar uma validao
de entrada de usurio?
a. Verdadeiro
b. Falso
Programao Java SE 7 9 - 29
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Resumo
Nesta lio, voc aprendeu a:
Definir a finalidade das excees Java
Usar as instrues try e throw
Usar as clusulas catch, multi-catch e finally
Fechar automaticamente os recursos com uma instruo
try-with-resources
Reconhecer categorias e classes de exceo comuns
Criar excees personalizadas e recursos que podem ser
fechados automaticamente
Testar invariantes por meio de asseres
Programao Java SE 7 9 - 30
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exerccio 9-1 - Viso Geral:
Capturando Excees
Este exerccio aborda os seguintes tpicos:
Adio de instrues try-catch a uma classe
Tratamento de excees
Neste exerccio, voc escreve o cdigo que lidar com excees verificadas e no
verificadas.
Programao Java SE 7 9 - 31
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exerccio 9-2 - Viso Geral:
Estendendo Exception
Este exerccio aborda os seguintes tpicos:
Adio de instrues try-catch a uma classe
Tratamento de excees
Extenso da classe Exception
Criao de um recurso personalizado que pode ser
fechado automaticamente
Uso de uma instruo try-with-resources
Lanamento de excees por meio de throw e throws
Neste exerccio, a implementao de um padro DAO atualizada para usar uma exceo
encapsuladora personalizada.
Programao Java SE 7 9 - 32
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Fundamentos de E/S da Java
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Objetivos
Aps concluir esta lio, voc ser capaz de:
Descrever as noes bsicas da entrada e sada na Java
Ler e gravar dados na console
Usar fluxos para ler e gravar arquivos
Ler e gravar objetos usando a serializao
Programao Java SE 7 10 - 2
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Noes Bsicas da E/S da Java
A linguagem de programao Java fornece um conjunto
abrangente de bibliotecas para executar funes de
entrada/sada (E/S).
A Java define um canal de E/S como fluxo.
Um Fluxo de E/S representa uma origem de entrada
ou um destino de sada.
Um fluxo pode representar vrios tipos diferentes de
origens e destinos, incluindo arquivos de disco,
dispositivos, outros programas e arrays de memria.
Os fluxos suportam vrios tipos diferentes de dados,
incluindo bytes simples, tipos de dados primitivos,
caracteres localizados e objetos.
Alguns fluxos simplesmente passam dados; outros manipulam e transformam os dados de
maneiras teis.
Programao Java SE 7 10 - 3
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Fluxos de E/S
Um programa usa um fluxo de entrada para ler dados em
uma origem, um item por vez.
Um programa usa um fluxo de sada para gravar dados
em um destino, um item por vez.
No importa como eles funcionam internamente, todos os fluxos apresentam o mesmo
modelo simples para programas que os utilizam: Um fluxo uma sequncia de dados.
Um fluxo um fluxo de dados. Um fluxo pode ser proveniente de uma origem ou ser gerado
para um destino.
Um fluxo de origem inicia o fluxo de dados, tambm chamado de fluxo de entrada.
Um fluxo de destino termina o fluxo de dados, tambm chamado de fluxo de sada.
As origens e os destinos so fluxos de ns. Os tipos de fluxos de ns so arquivos, memria
e pipes entre threads ou processos.
Programao Java SE 7 10 - 4
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Aplicao de E/S
Geralmente, um desenvolvedor pode usar a entrada e a sada
de trs maneiras:
Arquivos e
diretrios
Console:
(entrada padro,
sada padro)
Origens baseadas
em soquete
Um desenvolvedor de aplicao geralmente usa fluxos de E/S para ler e gravar arquivos,
para ler e gravar informaes para e de algum dispositivo de sada, como o teclado (entrada
padro) e a console (sada padro). Finalmente, talvez seja necessria uma aplicao para
usar um soquete a fim de se comunicar com outra aplicao em um sistema remoto.
Programao Java SE 7 10 - 5
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Dados Dentro de Fluxos
A tecnologia Java suporta dois tipos de fluxos: caractere
e byte.
A entrada e a sada de dados de caracteres so tratadas
por leitores e gravadores.
A entrada e a sada de dados de byte so tratadas por
fluxos de entrada e de sada:
Normalmente, o termo fluxo refere-se a um fluxo de bytes.
Os termos leitor e gravador referem-se a fluxos de
caracteres.
Fluxo Fluxos de Bytes Fluxos de Caracteres
Fluxos de origem
InputStream Reader
Fluxos de destino
OutputStream Writer
A tecnologia Java suporta dois tipos de dados em fluxos: bytes brutos e caracteres Unicode.
Geralmente, o termo fluxo refere-se a fluxos de bytes, e os termos leitor e gravador referem-
se a fluxos de caracteres.
Mais especificamente, os fluxos de entrada de bytes so implementados por subclasses da
classe InputStream, enquanto os fluxos de sada de bytes so implementados por
subclasses da classe OutputStream. Os fluxos de entrada de caracteres so
implementados por subclasses da classe Reader, enquanto os fluxos de sada de caracteres
so implementados por subclasses da classe Writer.
Os fluxos de bytes so mais adequados leitura e gravao ou aos bytes brutos (como
arquivos de imagem, arquivos de udio e objetos). Subclasses especficas fornecem
mtodos que oferecem suporte especfico a cada um desses tipos de fluxo.
Os fluxos de caracteres so projetados para ler caracteres (por exemplo, em arquivos ou em
outros fluxos baseados em caracteres).
Programao Java SE 7 10 - 6
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Mtodos InputStream de Fluxo de Bytes
Os trs mtodos bsicos read so:
int read()
int read(byte[] buffer)
int read(byte[] buffer, int offset, int length)
Outros mtodos incluem:
void close(); // Close an open stream
int available(); // Number of bytes available
long skip(long n); // Discard n bytes from stream
boolean markSupported(); //
void mark(int readlimit); // Push-back operations
void reset(); //
Mtodos InputStream
O mtodo read() retorna um int, que contm um byte lido do fluxo, ou um -1, que indica a
condio de fim de arquivo. Os outros dois mtodos read leem o fluxo em um array de bytes
e retornam o nmero de bytes lidos. Os dois argumentos int do terceiro mtodo indicam
uma subfaixa do array de destino que precisa ser preenchida.
Observao: Por questes de eficincia, sempre leia os dados no maior bloco prtico ou use
fluxos em buffer.
Quando tiver terminado o trabalho em um fluxo, feche-o. Se voc tiver uma pilha de fluxos,
use os fluxos de filtro para fechar o fluxo no topo da pilha. Essa operao tambm fecha os
fluxos inferiores.
Observao: Na Java SE 7, InputStream implementaAutoCloseable, que significa que,
se voc usar um InputStream (ou uma de suas subclasses) em um bloco try-with-
resources, o fluxo fechado automaticamente no fim do try.
O mtodo available relata o nmero de bytes que so disponibilizados imediatamente
para ser lido no fluxo. Uma operao de leitura real aps essa chamada pode retornar mais
bytes.
O mtodo skip descarta o nmero especfico de bytes do fluxo.
Programao Java SE 7 10 - 7
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Os mtodos markSupported(), mark() e reset() executaro operaes de push-back
em um fluxo, se suportadas por esse fluxo. O mtodo markSupported() retornaro true se
os mtodos mark() e reset() estiverem operacionais nesse fluxo especfico. O mtodo
mark(int) indica que o ponto atual no fluxo deve ser observado e um buffer grande o
suficiente para armazenar pelo menos o nmero de bytes de argumento especificado deve
ser alocado. O parmetro do mtodo mark(int) especifica o nmero de bytes que pode ser
relido chamando reset(). Aps as operaes read() subsequentes, a chamada do
mtodo reset() retornar o fluxo de entrada ao ponto marcado. Se voc ler alm do buffer
marcado, reset() no ter significado.
Programao Java SE 7 10 - 8
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Mtodos OutputStream de Fluxo de Bytes
Os trs mtodos bsicos write so:
void write(int c)
void write(byte[] buffer)
void write(byte[] buffer, int offset, int length)
Outros mtodos incluem:
void close(); // Automatically closed in try-with-resources
void flush(); // Force a write to the stream
Mtodos OutputStream
Como acontece com a entrada, sempre tente gravar dados no maior bloco prtico.
Programao Java SE 7 10 - 9
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exemplo de Fluxo de Bytes
1 import java.io.FileInputStream; import java.io.FileOutputStream;
2 import java.io.FileNotFoundException; import java.io.IOException;
3
4 public class ByteStreamCopyTest {
5 public static void main(String[] args) {
6 byte[] b = new byte[128]; int bLen = b.length;
7 // Example use of InputStream methods
8 try (FileInputStream fis = new FileInputStream (args[0]);
9 FileOutputStream fos = new FileOutputStream (args[1])) {
10 System.out.println ("Bytes available: " + fis.available());
11 int count = 0; int read = 0;
12 while (fis.read(b) != -1) {
13 if (read < bLen) fos.write(b, 0, read);
14 else fos.write(b);
15 count += read;
16 }
17 System.out.println ("Wrote: " + count);
18 } catch (FileNotFoundException f) {
19 System.out.println ("File not found: " + f);
20 } catch (IOException e) {
21 System.out.println ("IOException: " + e);
22 }
23 }
24 }
Observe que voc deve controlar
quantos bytes so lidos no array
de bytes por vez.
Este exemplo copia um arquivo para outro usando um array de bytes. Observe que
FileInputStream e FileOutputStream destinam-se a fluxo de bytes brutos, como os
arquivos de imagem.
Observao: O mtodo available(), de acordo com a Javadocs, relata "uma estimativa
do nmero de bytes restantes que podem ser lidos (ou ignorados) nesse fluxo de entrada
sem bloqueio".
Programao Java SE 7 10 - 10
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Mtodos Reader de Fluxo de Caracteres
Os trs mtodos bsicos read so:
int read()
int read(char[] cbuf)
int read(char[] cbuf, int offset, int length)
Outros mtodos incluem:
void close()
boolean ready()
long skip(long n)
boolean markSupported()
void mark(int readAheadLimit)
void reset()
Mtodos Reader
O primeiro mtodo retorna um int, que contm um caractere Unicode lido do fluxo, ou um -
1, que indica a condio de fim de arquivo. Os outros dois mtodos leem em um array de
caracteres e retornam o nmero de bytes lidos. Os dois argumentos int do terceiro mtodo
indicam uma subfaixa do array de destino que precisa ser preenchida.
Programao Java SE 7 10 - 11
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Mtodos Writer de Fluxo de Caracteres
Os mtodos bsicos write so:
void write(int c)
void write(char[] cbuf)
void write(char[] cbuf, int offset, int length)
void write(String string)
void write(String string, int offset, int length)
Outros mtodos incluem:
void close()
void flush()
Mtodos Writer
Os mtodos so anlogos aos mtodos OutputStream.
Programao Java SE 7 10 - 12
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exemplo de Fluxo de Caracteres
1 import java.io.FileReader; import java.io.FileWriter;
2 import java.io.IOException; import java.io.FileNotFoundException;
3
4 public class CharStreamCopyTest {
5 public static void main(String[] args) {
6 char[] c = new char[128]; int cLen = c.length;
7 // Example use of InputStream methods
8 try (FileReader fr = new FileReader(args[0]);
9 FileWriter fw = new FileWriter(args[1])) {
10 int count = 0;
11 int read = 0;
12 while ((read = fr.read(c)) != -1) {
13 if (read < cLen) fw.write(c, 0, read);
14 else fw.write(c);
15 count += read;
16 }
17 System.out.println ("Wrote: " + count + " characters.");
18 } catch (FileNotFoundException f) {
19 System.out.println("File " + args[0] + " not found.");
20 } catch (IOException e) {
21 System.out.println ("IOException: " + e);
22 }
23 }
24 }
Agora, em vez de um array de
bytes, essa verso usa um array
de caracteres.
Semelhante ao exemplo de fluxo de bytes, essa aplicao copia um arquivo para outro
usando um array de caracteres, em vez de um array de bytes. FileReader e FileWriter
so classes projetadas para ler e gravar fluxos de caracteres, como arquivos de texto.
Programao Java SE 7 10 - 13
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Encadeamento de Fluxos de E/S
Cadeia de Fluxos de Entrada
Cadeia de Fluxos de Sada
Origem de
Dados
Programa
Fluxo de Entrada
de Arquivo
Fluxo de Entrada
em Buffer
Fluxo de
Entrada de
Dados
Fluxo de Sada
de Dados
Fluxo de Sada em
Buffer
Fluxo de Sada
de Arquivo
Programa
Destino
de Dados
Um programa raramente usa um nico objeto de fluxo. Em vez disso, ele encadeia uma srie
de fluxos para processar os dados. A primeira figura no slide demonstra um exemplo de fluxo
de entrada; nesse caso, um fluxo de arquivo armazenado em buffer para obter mais
eficincia e, em seguida, convertido em itens de dados (primitivas Java). A segunda figura
demonstra um exemplo de fluxo de sada; nesse caso, os dados so gravados, armazenados
em buffer e, finalmente, gravados em um arquivo.
Programao Java SE 7 10 - 14
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exemplo de Fluxos Encadeados
1 import java.io.BufferedReader; import java.io.BufferedWriter;
2 import java.io.FileReader; import java.io.FileWriter;
3 import java.io.FileNotFoundException; import java.io.IOException;
4
5 public class BufferedStreamCopyTest {
6 public static void main(String[] args) {
7 try (BufferedReader bufInput
8 = new BufferedReader(new FileReader(args[0]));
9 BufferedWriter bufOutput
10 = new BufferedWriter(new FileWriter(args[1]))) {
11 String line = "";
12 while ((line = bufInput.readLine()) != null) {
13 bufOutput.write(line);
14 bufOutput.newLine();
15 }
16 } catch (FileNotFoundException f) {
17 System.out.println ("File not found: " + f);
18 } catch (IOException e) {
19 System.out.println("Exception: " + e);
20 }
21 }
22}
O buffer de caractere substitudo por uma
String. Observe que readLine() usa o
caractere de nova linha como terminador.
Portanto, voc deve adicion-lo novamente
ao arquivo de sada.
Um FileReader encadeado a um
BufferedFileReader: Isso permite o
uso de um mtodo que l uma String.
Veja a aplicao de cpia mais uma vez. Esta verso ilustra o uso de um BufferedReader
encadeado ao FileReader exibido antes.
O fluxo deste programa o mesmo do anterior. Em vez de ler um buffer de caracteres, o
programa l uma linha por vez, usando a varivel de linha para reter a String retornada
pelo mtodo readLine, o que oferece maior eficincia. O motivo que cada solicitao de
leitura composta por um Reader faz com que uma solicitao de leitura correspondente seja
composta pelo caractere subjacente ou fluxo de bytes. Um BufferedReader l os
caracteres do fluxo em um buffer (o tamanho do buffer pode ser definido, mas o valor padro
geralmente suficiente.)
Programao Java SE 7 10 - 15
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Processando Fluxos
Funcionalidade Fluxos de Caracteres Fluxos de Bytes
Armazenamento em
Buffer (Strings)
BufferedReader
BufferedWriter
BufferedInputStream
BufferedOutputStream
Filtragem FilterReader
FilterWriter
FilterInputStream
FilterOutputStream
Converso (byte em
caractere)
InputStreamReader
OutputStreamWriter
Serializao de
objeto
ObjectInputStream
ObjectOutputStream
Converso de dados DataInputStream
DataOutputStream
Contagem LineNumberReader LineNumberInputStream
Olhando adiante PushbackReader PushbackInputStream
Impresso PrintWriter PrintStream
Um fluxo de processamento executa uma converso em outro fluxo. Voc escolhe o tipo de
fluxo que se basear na funcionalidade necessria ao fluxo final.
Programao Java SE 7 10 - 16
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
E/S de Console
A classe System do pacote java.lang tem trs campos de
instncia estticos: out, in e err.
O campo System.out uma instncia esttica de um
objeto PrintStream que permite gravar na sada padro.
O campo System.in uma instncia esttica de um
objeto InputStream que permite ler na entrada padro.
O campo System.err uma instncia esttica de um
objeto PrintStream que permite gravar no erro padro.
E/S de Console Que Usa o Sistema
System.out o fluxo de sada padro. Esse fluxo j est aberto e pronto para
aceitar dados de sada. Geralmente, esse fluxo corresponde sada de exibio ou a
outro destino de sada especificado pelo usurio ou ambiente do host.
System.in o fluxo de entrada padro. Esse fluxo j est aberto e pronto para
fornecer dados de entrada. Geralmente, esse fluxo corresponde entrada de teclado
ou a outra origem de entrada especificada pelo usurio ou ambiente do host.
System.err o fluxo de sada de erro padro. Esse fluxo j est aberto e pronto
para aceitar dados de sada.
Geralmente, esse fluxo corresponde sada de exibio ou a outro destino de sada
especificado pelo usurio ou ambiente do host. Por conveno, esse fluxo de sada usado
para exibir mensagens de erro ou outras informaes que merecem ateno imediata de um
usurio, mesmo se o fluxo de sada principal, o valor da varivel out, tiver sido redirecionado
para um arquivo ou outro destino que, em geral, no monitorado continuamente.
Programao Java SE 7 10 - 17
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
java.io.Console
Alm dos objetos PrintStream, System tambm pode
acessar uma instncia do objeto java.io.Console:
1 Console cons = System.console();
2 if (cons != null) {
3 String userTyped; String pwdTyped;
4 do {
5 userTyped = cons.readLine("%s", "User name: ");
6 pwdTyped = new String(cons.readPassword("%s", "Password: "));
7 if (userTyped.equals("oracle") && pwdTyped.equals("tiger")) {
8 userValid = true;
9 } else {
10 System.out.println("Wrong user name/password. Try again.\n");
11 }
12 } while (!userValid);
13 }
Observe que voc deve passar o nome de usurio
e a senha para um processo de autenticao.
readPassword
no repete os
caracteres digitados
na console.
O objeto Console representa a console baseada em caractere associada JVM atual. Se
uma mquina virtual ter ou no uma console, isso depender da plataforma subjacente e da
maneira como a mquina virtual chamada.
O NetBeans, por exemplo, no tem uma console. Para executar o exemplo no projeto
SystemConsoleExample, use a linha de comando.
Observao: Este exemplo foi criado apenas para ilustrar os mtodos da classe da console.
Voc deve garantir que a vida til dos campos userTyped e pwdTyped seja a mais curta
possvel, e deve passar as credenciais recebidas para algum tipo de servio de autenticao.
Consulte a Java Authentication and Authorization Service (JAAS) API para obter mais
informaes:
http://download.oracle.com/javase/6/docs/technotes/guides/security/jaas/JAASRefGuide.html
Programao Java SE 7 10 - 18
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Gravando na Sada Padro
Os mtodos println e print so parte da classe
java.io.PrintStream.
Os mtodos println imprimem o argumento e um
caractere de nova linha (\n).
Os mtodos print imprimem o argumento sem um
caractere de nova linha.
Os mtodos print e println so sobrecarregados para
a maioria dos tipos primitivos (boolean, char, int,
long, float e double) e para char[], Object e
String.
Os mtodos print(Object) e println(Object)
chamam o mtodo toString no argumento.
Mtodos Print
Observe que h tambm um mtodo print formatado, printf. Esse mtodo foi abordado na
lio Processamento de String.
Programao Java SE 7 10 - 19
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Lendo na Entrada Padro
1 import java.io.BufferedReader;
2 import java.io.IOException;
3 import java.io.InputStreamReader;
4 public class KeyboardInput {
5 public static void main(String[] args) {
6 try (BufferedReader in =
7 new BufferedReader (new InputStreamReader (System.in))) {
8 String s = "";
9 // Read each input line and echo it to the screen.
10 while (s != null) {
11 System.out.print("Type xyz to exit: ");
12 s = in.readLine().trim();
13 System.out.println("Read: " + s);
14 if (s.equals ("xyz")) System.exit(0);
15 }
16 } catch (IOException e) {
17 System.out.println("Exception: " + e);
18 }
19}
Encadeie um leitor em
buffer em um fluxo de
entrada que use a entrada
da console.
A instruo try-with-resources na linha 6 abre BufferedReader, que est encadeado em
um InputStreamReader, que, por sua vez, est encadeado na entrada de console padro
esttica System.in.
Se a string lida for igual a xyz, o programa ser fechado. A finalidade do mtodo trim()
na String retornada por in.readLine remover quaisquer caracteres de espao em
branco.
Programao Java SE 7 10 - 20
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
E/S de Canal
Recurso incorporado no JDK 1.4, um canal l bytes e
caracteres em blocos, em vez de ler um byte ou um caractere
por vez.
1 import java.io.FileInputStream; import java.io.FileOutputStream;
2 import java.nio.channels.FileChannel; import java.nio.ByteBuffer;
3 import java.io.FileNotFoundException; import java.io.IOException;
4
5 public class ByteChannelCopyTest {
6 public static void main(String[] args) {
7 try (FileChannel fcIn = new FileInputStream(args[0]).getChannel();
8 FileChannel fcOut = new FileOutputStream(args[1]).getChannel()) {
9 ByteBuffer buff = ByteBuffer.allocate((int) fcIn.size());
10 fcIn.read(buff);
11 buff.position(0);
12 fcOut.write(buff);
13 } catch (FileNotFoundException f) {
14 System.out.println ("File not found: " + f);
15 } catch (IOException e) {
16 System.out.println ("IOException: " + e);
17 }
18 }
19 }
Crie um buffer com o mesmo
tamanho do arquivo; em seguida,
leia e grave o arquivo em uma nica
operao.
Neste exemplo, um arquivo pode ser lido completamente em um buffer e, depois, gravado
em uma nica operao.
A E/S de canal foi incorporado no pacote java.nio do JDK 1.4.
Programao Java SE 7 10 - 21
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exerccio 10-1 - Viso Geral:
Gravando uma Aplicao de E/S de Console Simples
Este exerccio aborda os seguintes tpicos:
Gravao de uma classe principal que aceita um nome
de arquivo como argumento.
Uso da E/S de console System para ler uma string
de pesquisa.
Uso do encadeamento de fluxos para usar o mtodo
apropriado de procura da string no arquivo e relatar
o nmero de ocorrncias.
Continuao da leitura na console at que uma
sequncia de sada seja informada.
Neste exerccio, voc gravar o cdigo necessrio leitura de um nome de arquivo como
argumento de aplicao e usar a console System para ler na entrada padro at que um
caractere de terminao seja digitado.
Programao Java SE 7 10 - 22
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Persistncia
O salvamento dos dados em um tipo de armazenamento
permanente denominado persistncia. Um objeto com
capacidade de persistncia pode ser armazenado em disco
(ou em qualquer outro dispositivo de armazenamento) ou
enviado a outra mquina.
Um objeto no persistente existir contanto que a Java
Virtual Machine esteja em execuo.
A serializao Java o mecanismo padro que salva um
objeto como uma sequncia de bytes que podem ser
recompilados posteriormente em uma cpia do objeto.
Para serializar um objeto de uma classe especfica,
a classe deve implementar a interface
java.io.Serializable.
A interface java.io.Serializable no define mtodos e atua somente como um
marcador para indicar que a classe deve ser considerada para serializao.
Programao Java SE 7 10 - 23
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Serializao e Grficos de Objeto
Quando um objeto serializado, somente os campos
do objeto so preservados.
Quando um campo fizer referncia a um objeto,
os campos do objeto referenciado tambm sero
serializados, se a classe desse objeto tambm for
serializvel.
A rvore dos campos de um objeto constitui o grfico
de objeto.
A
D
C B
D
Grficos de Objeto
A serializao atravessa o grfico de objeto e grava esses dados no arquivo (ou em outro
fluxo de sada) em cada n do grfico.
Programao Java SE 7 10 - 24
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Campos e Objetos Transientes
Algumas classes de objeto no podem ser serializveis
porque representam informaes transientes especficas
do sistema operacional.
Se o grfico de objeto contiver uma referncia no
serializvel, uma NotSerializableException ser
lanada e a operao de serializao falhar.
Os campos que no devem ou no precisam ser
serializados podem ser marcados com a palavra-chave
transient.
A
D
C B
D
Transient
Se um campo que contm uma referncia de objeto for encontrado e no estiver marcado
como serializvel (implementejava.io.Serializable), uma
NotSerializableException ser lanada e a operao de serializao completa falhar.
Para serializar um grfico que contm campos que fazem referncia a objetos no
serializveis, esses campos devero ser marcados por meio da palavra-chave transient.
Programao Java SE 7 10 - 25
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Transient: Exemplo
public class Portfolio implements Serializable {
public transient FileInputStream inputFile;
public static int BASE = 100;
private transient int totalValue = 10;
protected Stock[] stocks;
}
O modificador de acesso a campos no tem efeito sobre
o campo de dados que est sendo serializado.
Os valores armazenados em campos estticos no so
serializados.
Quando o objeto for desserializado, os valores dos
campos estticos sero definidos como os valores
declarados na classe. O valor dos campos transientes
no estticos so definidos como o valor padro do tipo.
Os campos static
no so serializados.
A serializao incluir todos os
membros do array stocks.
Quando o objeto for desserializado, os valores dos campos estticos sero definidos como
os valores definidos na declarao da classe. Os valores dos campos no estticos so
definidos como o valor padro do tipo. Portanto, no exemplo mostrado no slide, o valor de
BASE ser 100, por declarao de classe. O valor dos campos transientes no estticos,
inputFile e totalValue, so definidos como valores padro, null e 0, respectivamente.
Programao Java SE 7 10 - 26
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
UID de Verso Serial
Durante a serializao, um nmero de verso,
serialVersionUID, usado para associar a sada
serializada classe usada no processo de serializao.
Aps a desserializao, o serialVersionUID verificado
para confirmar se as classes carregadas so compatveis
com o objeto que est sendo desserializado.
Se o receptor de um objeto serializado tiver carregado
classes para esse objeto com serialVersionUID diferente,
a desserializao resultar em uma
InvalidClassException.
Uma classe serializvel pode declarar seu prprio
serialVersionUID declarando explicitamente um campo
chamado serialVersionUID como um final esttico
e do tipo long:
private static long serialVersionUID = 42L;
Observao: A documentao de java.io.Serializable afirma o seguinte:
Se uma classe serializvel no declarar explicitamente um serialVersionUID, o runtime
de serializao calcular um valor padro de serialVersionUID para essa classe, com
base em vrios aspectos da classe, conforme descrito na Java(TM) Object Serialization
Specification. No entanto, altamente recomendvel que todas as classes serializveis
declarem explicitamente valores de serialVersionUID, j que a computao padro de
serialVersionUID altamente confidencial para os detalhes da classe que podem variar
de acordo com as implementaes do compilador, podendo, desse modo, resultar em
InvalidClassExceptions inesperadas durante a desserializao. Portanto, para garantir
um valor de serialVersionUID consistente entre diferentes implementaes de
compilador java, uma classe serializvel deve declarar um valor explcito de
serialVersionUID. altamente recomendvel tambm que declaraes explcitas de
serialVersionUID usem o modificador privado quando possvel, pois essas declaraes
se aplicam somente classe de declarao imediata -- os campos serialVersionUID
no so teis como membros herdados. As classes de array no podem declarar um
serialVersionUID explcito; portanto, elas sempre tm o valor computado padro, mas o
requisito para correspondncia dos valores de serialVersionUID fica isento nas classes
de array.
Programao Java SE 7 10 - 27
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exemplo de Serializao
Neste exemplo, um Portflio composto por um conjunto de
Aes.
Durante a serializao, o preo atual no serializado e,
portanto, marcado como transient.
No entanto, queremos que o valor atual da ao seja definido
como o preo atual de mercado aps a desserializao.
Programao Java SE 7 10 - 28
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Gravando e Lendo um Fluxo de Objetos
1 public static void main (String[] args) {
2 Stock s1 = new Stock("ORCL", 100, 32.50);
3 Stock s2 = new Stock("APPL", 100, 245);
4 Stock s3 = new Stock("GOGL", 100, 54.67);
5 Portfolio p = new Portfolio(s1, s2, s3);
6 try (FileOutputStream fos = new FileOutputStream(args[0]);
7 ObjectOutputStream out = new ObjectOutputStream(fos)) {
8 out.writeObject(p);
9 } catch (IOException i) {
10 System.out.println("Exception writing out Portfolio: " + i);
11 }
12 try (FileInputStream fis = new FileInputStream (args[0]);
13 ObjectInputStream in = new ObjectInputStream(fis)) {
14 Portfolio newP = (Portfolio)in.readObject();
15 } catch (ClassNotFoundException | IOException i) {
16 System.out.println("Exception reading in Portfolio: " + i);
17 }
O mtodo readObject
restaura o objeto no fluxo
de arquivos.
O mtodo writeObject grava o
grfico de objeto de p no fluxo de
arquivos.
Portfolio o objeto
raiz.
A classe SerializeStock.
Linha 6 8: Um FileOutputStream encadeado em um ObjectOutputStream.
Isso permite que os bytes brutos gerados pelo ObjectOutputStream sejam gravados
em um arquivo por meio do mtodo writeObject. Esse mtodo percorre o grfico do
objeto e grava os dados contidos nos campos no transientes e no estticos como
bytes brutos.
Linha 12 14: Para restaurar um objeto de um arquivo, um FileInputStream
encadeado a um ObjectInputStream. Os bytes brutos lidos pelo mtodo
readObject restauram um Object que contm os campos de dados transientes e
no estticos. Esse Object deve ser convertido no tipo esperado.
Programao Java SE 7 10 - 29
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Mtodos de Serializao
Um objeto que est sendo serializado (e desserializado) pode
controlar a serializao de seus prprios campos.
public class MyClass implements Serializable {
// Fields
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
// Write/save additional fields
oos.writeObject(new java.util.Date());
}
}
Por exemplo, nessa classe, a hora atual gravada no
grfico de objeto.
Durante a desserializao, um mtodo similar chamado:
private void readObject(ObjectInputStream ois) throws
ClassNotFoundException, IOException {}
defaultWriteObject
chamado para executar a
serializao desses campos
de classes.
O mtodo writeObject chamado no objeto que est sendo serializado. Se o objeto no
contiver esse mtodo, o mtodo defaultWriteObject ser chamado.
Esse mtodo tambm deve ser chamado somente uma vez no mtodo writeObject
do objeto.
Durante a desserializao, o mtodo readObject chamado no objeto que est sendo
desserializado (caso esteja presente no arquivo de classe do objeto). A assinatura do mtodo
importante.
private void readObject(ObjectInputStream ois) throws
ClassNotFoundException, IOException {
ois.defaultReadObject();
// Print the date this object was serialized
System.out.println ("Restored from date: " +
(java.util.Date)ois.readObject()));
}
Programao Java SE 7 10 - 30
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exemplo de readObject
1 public class Stock implements Serializable {
2 private static final long serialVersionUID = 100L;
3 private String symbol;
4 private int shares;
5 private double purchasePrice;
6 private transient double currPrice;
7
8 public Stock(String symbol, int shares, double purchasePrice) {
9 this.symbol = symbol;
10 this.shares = shares;
11 this.purchasePrice = purchasePrice;
12 setStockPrice();
13 }
14
15 // This method is called post-serialization
16 private void readObject(ObjectInputStream ois)
17 throws IOException, ClassNotFoundException {
18 ois.defaultReadObject();
19 // perform other initialization
20 setStockPrice();
21 }
22 }
O currPrice da Ao definida
pelo mtodo setStockPrice
durante a criao do objeto Stock,
mas o construtor no chamado
durante a desserializao.
O currPrice da Ao definido
depois que os outros campos so
desserializados
Na classe Stock, o mtodo readObject fornecido para garantir que o currPrice da
ao seja definido (pelo mtodo setStockPrice) aps a desserializao do objeto Stock.
Observao: A assinatura do mtodo readObject essencial para que ele seja chamado
durante a desserializao.
Programao Java SE 7 10 - 31
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Resumo
Nesta lio, voc aprendeu a:
Descrever as noes bsicas de entrada e sada na Java
Ler e gravar dados na console
Usar fluxos para ler e gravar arquivos
Ler e gravar objetos usando a serializao
Programao Java SE 7 10 - 32
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
A finalidade de encadear fluxos :
a. Permitir que os fluxos adicionem funcionalidade
b. Alterar a direo do fluxo
c. Modificar o acesso do fluxo
d. Atender aos requisitos do JDK 7
Programao Java SE 7 10 - 33
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Para impedir a serializao de campos especficos do sistema
operacional, marque o campo:
a. private
b. static
c. transient
d. final
Programao Java SE 7 10 - 34
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Considerando os seguintes fragmentos:
public MyClass implements Serializable {
private String name;
private static int id = 10;
private transient String keyword;
public MyClass(String name, String keyword) {
this.name = name; this.keyword = keyword;
}
}
MyClass mc = new MyClass ("Zim", "xyzzy");
Assumindo que nenhuma outra alterao ser feita nos dados,
qual o valor dos campos name e keyword aps a desserializao
da instncia do objeto mc?
a. Zim, ""
b. Zim, null
c. Zim, xyzzy
d. "", null
Programao Java SE 7 10 - 35
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Considerando o seguinte fragmento:
1 public class MyClass implements Serializable {
2 private transient String keyword;
3 public void readObject(ObjectInputStream ois)
4 throws IOException, ClassNotFoundException {
5 ois.defaultReadObject();
6 String this.keyword = (String)ois.readObject();
7 }
8 }
O que necessrio para desserializar corretamente um fluxo
que contm esse objeto?
a. Torne o campo keyword static
b. Altere o modificador de acesso a campos para public
c. Torne o mtodo readObject private (linha 3)
d. Use readString em vez de readObject (linha 6)
Programao Java SE 7 10 - 36
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exerccio 10-2 - Viso Geral:
Serializando e Desserializando um ShoppingCart
Este exerccio aborda os seguintes tpicos:
Criao de uma aplicao que serializa um objeto
ShoppingCart composto por uma ArrayList de
objetos Item
Uso da palavra-chave transient para impedir a
serializao do total de ShoppingCart. Isso permitir
que os itens variem seu custo.
Use to mtodo writeObject para armazenar a data
de hoje no fluxo serializado.
Use o mtodo readObject para
recalcular o custo total do carrinho aps
a desserializao e imprimir a data em que
o objeto foi serializado.
Programao Java SE 7 10 - 37
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
E/S de Arquivo da Java (NIO.2)
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Objetivos
Aps concluir esta lio, voc ser capaz de:
Usar a interface Path para operar em caminhos de
arquivo e diretrio
Usar a classe Files para verificar, deletar, copiar ou
mover um arquivo ou diretrio
Usar mtodos da classe Files para ler e gravar arquivos
usando a E/S de canal e de fluxo
Ler e alterar atributos de arquivo e diretrio
Acessar recursivamente uma rvore de diretrios
Localizar um arquivo usando
a classe PathMatcher
Programao Java SE 7 11 - 2
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Nova API de E/S de Arquivo (NIO.2)
Interface Avanada
de Sistema de Arquivos
Funcionalidade Completa
do Canal de Soquete
E/S Assncrona Escalonvel
A API NIO na JSR 51 estabeleceu a base da NIO em Java, enfocando buffers, canais e
conjuntos de caracteres. A JSR 51 forneceu a primeira parte das E/Ss de soquete
escalonveis na plataforma, fornecendo uma API de E/S multiplexada e sem bloqueio,
permitindo o desenvolvimento de servidores altamente escalonveis sem precisar recorrer ao
cdigo nativo.
Para vrios desenvolvedores, a meta mais significativa da JSR 203 resolver os problemas
do java.io.File desenvolvendo uma nova interface de sistema de arquivos.
A nova API:
Trabalha de modo mais consistente entre as plataformas
Facilita a gravao de programas que tratam normalmente da falha das operaes do
sistema de arquivos
Fornece acesso mais eficiente a um conjunto maior de atributos de arquivo
Permite que os desenvolvedores de aplicaes sofisticadas tirem proveito dos recursos
especficos de plataforma quando absolutamente necessrio
Permite o suporte a sistemas de arquivos no nativos, para que eles sejam
conectados plataforma
Programao Java SE 7 11 - 3
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Limitaes de java.io.File
No funciona bem com links simblicos
Conjunto muito limitado
de atributos de arquivo
Problemas de desempenho
Problemas de escalabilidade
Funcionalidade bsica de acesso ao sistema de arquivos
A API de Arquivo de E/S da Java (java.io.File) apresentou desafios aos
desenvolvedores.
Vrios mtodos no lanavam excees quando apresentavam falha; portanto, no era
possvel obter uma mensagem de erro til.
Vrias operaes estavam ausentes (cpia de arquivo, movimentao de arquivo etc.).
O mtodo de renomeao no funcionava de modo consistente entre as plataformas.
No havia suporte real a links simblicos.
Era necessrio mais suporte a metadados, como permisses de arquivos, proprietrio
de arquivo e outros atributos de segurana.
O acesso aos metadados de arquivo era ineficiente; cada chamada de metadados
resultava em uma chamada de sistema, o que tornava as operaes muito ineficientes.
Vrios mtodos File no eram escalonados. A solicitao de uma listagem de diretrio
grande em um servidor podia resultar em trava.
No era possvel gravar um cdigo confivel que pudesse percorrer recursivamente
uma rvore de diretrios e responder corretamente se houvesse links simblicos
circulares.
Alm disso, a E/S geral no foi gravada para ser estendida. Os desenvolvedores precisavam
ser capazes de desenvolver suas prprias implementaes de sistema de arquivos. Por
exemplo, mantendo um sistema de pseudoarquivo na memria ou formatando arquivos como
zip.
Programao Java SE 7 11 - 4
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Sistemas de Arquivos, Caminhos, Arquivos
No NIO.2, arquivos e diretrios so representados por um
caminho, que o local relativo ou absoluto do arquivo ou
diretrio.
n raiz:
/ (Solaris)
C:\ (Windows)
Admin
Documents and Settings labs
student
finance.xls logfile.txt
Sistemas de Arquivos
Antes da implementao do NIO.2 no JDK 7, os arquivos eram representados pela classe
java.io.File.
No NIO.2, instncias dos objetos java.nio.file.Path so usadas para representar
o local relativo ou absoluto de um arquivo ou diretrio.
Os sistemas de arquivos so estruturas hierrquicas (rvore). Os sistemas de arquivos
podem ter um ou mais diretrios raiz. Por exemplo, as mquinas Windows comuns tm,
no mnimo, dois ns raiz de disco: C:\ e D:\.
Observe que os sistemas de arquivos tambm podem ter caractersticas diferentes para
separadores de caminho, conforme mostrado no slide.
Programao Java SE 7 11 - 5
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Caminho Relativo x Caminho Absoluto
Um caminho relativo ou absoluto.
Um caminho absoluto sempre contm o elemento raiz
e a lista de diretrios completa necessria para localizar
o arquivo.
Exemplo:
Um caminho relativo deve ser combinado com outro
caminho para acessar um arquivo.
Exemplo:
...
/home/peter/statusReport
...
...
clarence/foo
...
Um caminho pode ser relativo ou absoluto. Um caminho absoluto sempre contm o
elemento raiz e a lista de diretrios completa necessria para localizar o arquivo. Por
exemplo, /home/peter/statusReport um caminho absoluto. Todas as informaes
necessrias para localizar o arquivo esto contidas na string de caminho.
Um caminho relativo deve ser combinado com outro caminho para acessar um arquivo. Por
exemplo, clarence/foo um caminho relativo. Sem mais informaes, um programa no
pode localizar confiavelmente o diretrio clarence/foo no sistema de arquivos.
Programao Java SE 7 11 - 6
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Links Simblicos
/ (raiz do Solaris)
Ou C:\ (raiz do
Windows)
home
clarence peter logFile (file)
foo
bar statusReport (file)
homeLogFile
(file)
logs
dir
Os objetos de sistema de arquivos so, na maioria das vezes, diretrios ou arquivos. Todos
os usurios esto familiarizados com esses objetos. Mas alguns sistemas de arquivos
tambm oferecem suporte noo de links simblicos. Um link simblico tambm
conhecido como symlink ou soft link.
O link simblico um arquivo especial que serve como referncia para outro arquivo. O link
simblico geralmente transparente para o usurio. A leitura ou gravao de um link
simblico o mesmo que ler ou gravar qualquer outro arquivo ou diretrio.
No diagrama do slide, logFile aparece para o usurio como um arquivo regular, mas ,
na verdade, um link simblico para dir/logs/HomeLogFile. HomeLogFile o destino
do link.
Programao Java SE 7 11 - 7
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Conceitos do Java NIO.2
Antes do JDK 7, a classe java.io.File era o ponto
de entrada para todas as operaes de arquivo e diretrio.
Com o NIO.2, h um novo pacote e classes:
java.nio.file.Path: Localiza um arquivo ou diretrio
usando um caminho dependente de sistema
java.nio.file.Files: Usando um Path, executa
operaes em arquivos e diretrios
java.nio.file.FileSystem: Faz a interface com um
sistema de arquivos e uma fbrica para criar um Path e
outros objetos que acessam um sistema de arquivos
Todos os mtodos que acessam o sistema de arquivos
lanam IOException ou uma subclasse.
Java NIO.2
Uma diferena significativa entre o NIO.2 e o java.io.File a arquitetura de acesso ao
sistema de arquivos. Com a classe java.io.File, os mtodos usados para manipular
informaes de caminho esto na mesma classe que os mtodos usados para ler e gravar
arquivos e diretrios.
No NIO.2, as duas preocupaes so separadas. Os caminhos so criados e manipulados
por meio da interface Path, enquanto a operao em arquivos e diretrios
responsabilidade da classe Files, que opera somente nos objetos Path.
Finalmente, diferente doe java.io.File, os mtodos da classe Files que operam
diretamente no sistema de arquivos lanam uma IOException (ou uma subclasse).
As subclasses fornecem detalhes sobre a causa da exceo.
Programao Java SE 7 11 - 8
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Interface Path
A interface java.nio.file.Path fornece o ponto de
entrada para a manipulao de arquivos e diretrios do NIO.2.
Para obter um objeto Path, obtenha uma instncia do
sistema de arquivos padro e chame o mtodo getPath:
FileSystem fs = FileSystems.getDefault();
Path p1 = fs.getPath ("D:\\labs\\resources\\myFile.txt");
O pacote java.nio.file tambm fornece uma classe
de ajuda final esttica Paths para executar getDefault:
Path p1 = Paths.get ("D:\\labs\\resources\\myFile.txt");
Path p2 = Paths.get ("D:", "labs", "resources", "myFile.txt");
Path p3 = Paths.get ("/temp/foo");
Path p4 = Paths.get (URI.create ("file:///~/somefile");
Barra invertida
com escape
O ponto de entrada para a manipulao de arquivos e diretrios do NIO.2 uma instncia da
interface Path. O provedor (nesse caso, o provedor padro) cria um objeto que implementa
essa classe e manipula todas as operaes a serem executadas em um arquivo ou diretrio
em um sistema de arquivos.
Os objetos Path so imutveis depois que so criados, no podem ser alterados.
Observe que, se voc pretende usar o sistema de arquivos padro, ou seja, o sistema de
arquivos que est sendo executado nas operaes Path o utilitrio Paths o mtodo
mais curto. No entanto, se voc quiser realizar operaes Path em um sistema de arquivos
que no seja o padro, obter uma instncia do sistema de arquivos desejado e usar a
primeira abordagem para criar objetos Path.
Observao: O sistema de arquivos Windows usa uma barra invertida, por padro. No
entanto, o Windows pode aceitar barras invertidas e barras nas aplicaes (exceto o shell do
comando). Alm disso, as barras invertidas na Java devem ter escape. Para representar uma
barra invertida em uma string, digite a barra invertida duas vezes. Como essa aparncia no
atrativa, e o Windows usa barras invertidas e barras, os exemplos mostrados neste curso
usaro a barra invertida em strings.
Programao Java SE 7 11 - 9
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Recursos da Interface Path
A interface Path define os mtodos usados para localizar um
arquivo ou diretrio em um sistema de arquivos. Estes
mtodos incluem:
Para acessar os componentes de um caminho:
getFileName, getParent, getRoot, getNameCount
Para operar em um caminho:
normalize, toUri, toAbsolutePath, subpath,
resolve, relativize
Para comparar caminhos:
startsWith, endsWith, equals
Os Objects Path So Semelhantes aos Objetos String
melhor considerar os objetos Path como se fossem objetos String. Os objetos Path
podem ser criados em uma string de texto nica ou em um conjunto de componentes:
Um componente raiz, que identifica a hierarquia do sistema de arquivos
Um elemento de nome, mais distante do elemento raiz, que define o arquivo ou diretrio
para o qual o caminho aponta
Elementos adicionais podem estar presentes tambm, separados por um caractere
especial ou delimitador que identifica nomes de diretrio que fazem parte da hierarquia
Os objetos Path so imutveis. Depois de criados, as operaes nos objetos Path retornam
novos objetos Path.
Programao Java SE 7 11 - 10
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Path: Exemplo
1 public class PathTest
2 public static void main(String[] args) {
3 Path p1 = Paths.get(args[0]);
4 System.out.format("getFileName: %s%n", p1.getFileName());
5 System.out.format("getParent: %s%n", p1.getParent());
6 System.out.format("getNameCount: %d%n", p1.getNameCount());
7 System.out.format("getRoot: %s%n", p1.getRoot());
8 System.out.format("isAbsolute: %b%n", p1.isAbsolute());
9 System.out.format("toAbsolutePath: %s%n", p1.toAbsolutePath());
10 System.out.format("toURI: %s%n", p1.toUri());
11 }
12 }
java PathTest D:/Temp/Foo/file1.txt
getFileName: file1.txt
getParent: D:\Temp\Foo
getNameCount: 3
getRoot: D:\
isAbsolute: false
toAbsolutePath: D:\Temp\Foo\file1.txt
toURI: file:///D:/Temp/Foo/file1.txt
Execute em uma mquina Windows.
Observe que, exceto em um shell cmd,
as barras invertidas e as barras so legais.
Diferente da classe java.io.File, os arquivos e diretrios so representados por
instncias dos objetos Path de uma forma dependente do sistema.
A interface Path fornece vrios mtodos para relatar informaes sobre o caminho:
Path getFileName: O ponto final deste Path, retornado como um objeto Path
Path getParent: O caminho pai ou nulo. Tudo que consta no Path at o nome do
arquivo (arquivo ou diretrio)
int getNameCount: O nmero de elementos de nome que compem esse caminho
Path getRoot: O componente raiz desse Path
boolean isAbsolute: true se esse caminho contiver um elemento raiz dependente
do sistema. Observao: Como esse exemplo est sendo executado em uma mquina
Windows, o elemento raiz dependente do sistema contm uma letra de unidade e dois-
pontos. Em um SO baseado em UNIX, isAbsolute retornar true para qualquer
caminho que comece com uma barra.
Path toAbsolutePath: Retorna um campo que representa o caminho absoluto
deste caminho
java.net.URI toUri: retorna um URI absoluto.
Observao: Um objeto Path pode ser criado para qualquer caminho. O arquivo ou diretrio
real no precisam existir.
Programao Java SE 7 11 - 11
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Removendo Redundncias de um Path
Vrios sistemas de arquivos usam a notao . para
representar o diretrio atual e .. para representar o
diretrio pai.
Os exemplos a seguir incluem redundncias:
O mtodo normalize remove quaisquer elementos
redundantes, que incluem qualquer ocorrncia de . ou
directory/...
Exemplo:
/home/./clarence/foo
/home/peter/../clarence/foo
Path p = Paths.get("/home/peter/../clarence/foo");
Path normalizedPath = p.normalize();
/home/clarence/foo
Vrios sistemas de arquivos usam a notao . para representar o diretrio atual e .. para
representar o diretrio pai. Pode acontecer de Path conter informaes de diretrio
redundantes. Talvez um servidor esteja configurado para salvar seus arquivos de log no
diretrio /dir/logs/., e voc queira deletar a notao /. posterior do caminho.
O mtodo normalize remove quaisquer elementos redundantes, que incluem qualquer
ocorrncia de . ou directory/... Os exemplos do slide sero normalizados para
/home/clarence/foo.
importante observar que normalize no verifica o sistema de arquivos quando ele limpa
um caminho. uma operao meramente sinttica. No segundo exemplo, se peter fosse
um link simblico, a remoo de peter/.. poderia resultar em um caminho que no localiza
mais o arquivo pretendido.
Programao Java SE 7 11 - 12
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Criando um Subcaminho
Uma parte de um caminho pode ser obtida por meio da
criao de um subcaminho usando o mtodo subpath:
Path subpath(int beginIndex, int endIndex);
O elemento retornado por endIndex tem um a menos
que o valor endIndex.
Exemplo:
Path p1 = Paths.get ("D:/Temp/foo/bar");
Path p2 = p1.subpath (1, 3);
foo\bar
Temp = 0
foo = 1
bar = 2
Inclua o elemento no ndice 2.
O nome de elemento mais prximo raiz tem o ndice 0.
O elemento mais distante da raiz tem o ndice count-1.
Observao: O objeto Path retornado tem os elementos de nome que comeam em
beginIndex e estendem at o elemento no ndice endIndex-1.
Programao Java SE 7 11 - 13
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Unindo Dois Caminhos
O mtodo resolve usado para combinar dois caminhos.
Exemplo:
Se voc passar um caminho absoluto para o mtodo
resolve, o caminho passado ser retornado.
Path p1 = Paths.get("/home/clarence/foo");
p1.resolve("bar"); // Returns /home/clarence/foo/bar
Paths.get("foo").resolve("/home/clarence"); // Returns /home/clarence
O mtodo resolve usado para combinar caminhos. Ele aceita um caminho parcial, que
um caminho que no inclui um elemento raiz, e esse caminho parcial acrescentado ao
caminho original.
Programao Java SE 7 11 - 14
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Criando um Caminho Entre os Dois Caminhos
O mtodo relativize permite construir um caminho
de um local no sistema de arquivos para outro local.
O mtodo construi um caminho que se origina no caminho
original e termina no local especificado pelo caminho
passado.
O novo caminho relativo ao caminho original.
Exemplo:
Path p1 = Paths.get("peter");
Path p2 = Paths.get("clarence");
Path p1Top2 = p1.relativize(p2); // Result is ../clarence
Path p2Top1 = p2.relativize(p1); // Result is ../peter
Um requisito comum quando voc est gravando o cdigo de E/S do arquivo a capacidade
de construir um caminho de um local no sistema de arquivos para outro local. possvel
realizar isso usando o mtodo relativize. Esse mtodo constroi um caminho que se
origina no caminho original e termina no local especificado pelo caminho passado. O novo
caminho relativo ao caminho original.
Programao Java SE 7 11 - 15
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Trabalhando com Links
A interface Path reconhece link.
Cada mtodo Path:
Detecta o que fazer quando um link simblico encontrado
ou
Fornece uma opo que permite configurar o
comportamento quando um link simblico encontrado
createSymbolicLink(Path, Path, FileAttribute<?>)
createLink(Path, Path) isSymbolicLink(Path) readSymbolicLink(Path)
Criando um link simblico
Criando um link fsico
Detectando um link simblico
Localizando o destino de um link
O pacote java.nio.file e a interface Path em particular reconhecem link. Cada mtodo
Path detecta o que fazer quando um link simblico encontrado ou fornece uma opo que
permite configurar o comportamento quando um link simblico encontrado.
Alguns sistemas de arquivo tambm suportam links fsicos. Os links fsicos so mais
restritivos do que os links simblicos, da seguinte maneira:
O destino do link deve existir.
Os links fsicos geralmente no so permitidos nos diretrios.
Os links fsicos no so permitidos para atravessar parties ou volumes. Portanto, eles
no podem existir entre sistemas de arquivos.
Um link fsico parece com um arquivo regular, e se comporta como tal; portanto, pode
ser difcil encontr-lo.
Um link fsico , para todas as finalidades, a mesma entidade que o arquivo original. Os
links fsicos tm as mesmas permisses de arquivo, timestamps etc. Todos os atributos
so idnticos.
Devido a essas restries, os links fsicos no so usados com tanta frequncia quanto os
links simblicos, mas os mtodos Path funcionam continuamente com os links fsicos.
Programao Java SE 7 11 - 16
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Considerando um objeto Path com o seguinte caminho:
/export/home/heimer/../williams/./documents
Qual mtodo Path remover os elementos redundantes?
a. normalize
b. relativize
c. resolve
d. toAbsolutePath
Programao Java SE 7 11 - 17
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Considerando o seguinte caminho:
Path p = Paths.get
("/home/export/tom/documents/coursefiles/JDK7");
e a instruo:
Path sub = p.subPath (x, y);
Quais valores de x e y produziro um Path que contm
documents/coursefiles?
a. x = 3, y = 4
b. x = 3, y = 5
c. x = 4, y = 5
d. x = 4, y = 6
Programao Java SE 7 11 - 18
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Considerando este fragmento de cdigo:
Path p1 = Paths.get("D:/temp/foo/");
Path p2 = Paths.get("../bar/documents");
Path p3 = p1.resolve(p2).normalize();
System.out.println(p3);
Qual o resultado?
a. Erro de compilador
b. IOException
c. D:\temp\foo\documents
d. D:\temp\bar\documents
e. D:\temp\foo\..\bar\documents
Programao Java SE 7 11 - 19
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Operaes de File
Verificando um Arquivo ou Diretrio
Deletando um Arquivo ou Diretrio
Copiando um Arquivo ou Diretrio
Movendo um Arquivo ou Diretrio
Gerenciando Metadados
Lendo, Gravando e Criando Arquivos
Arquivos de Acesso Aleatrio
Criando e Lendo Diretrios
A classe java.nio.file.Files o ponto de entrada primrio das operaes nos objetos
Path.
Os mtodos estticos desta classe leem, gravam e manipulam arquivos e diretrios
representados pelos objetos Path.
A classe Files tambm reconhece links; os mtodos detectam links simblicos em objetos
Path e gerenciam links automaticamente ou fornecem opes para lidar com links.
Programao Java SE 7 11 - 20
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Verificando um Arquivo ou Diretrio
Um objeto Path representa o conceito de um local de arquivo
ou diretrio. Para que voc possa acessar um arquivo ou
diretrio, primeiro acesse o sistema de arquivos para
determinar se ele existe, usando os seguintes mtodos Files:
exists(Path p, LinkOption... option)
Faz o teste para constatar que um arquivo existe.
Por padro, os links simblicos so seguidos.
notExists(Path p, LinkOption... option)
Faz o teste para constatar que um arquivo no existe.
Por padro, os links simblicos so seguidos.
Exemplo:
Path p = Paths.get(args[0]);
System.out.format("Path %s exists: %b%n", p,
Files.exists(p, LinkOption.NOFOLLOW_LINKS));
Argumento opcional
Relembre que os objetos Path podem apontar para arquivos ou diretrios que no existem.
Os mtodos exists() e notExists() so usados para determinar se o Path aponta para
um arquivo ou diretrio legtimo, e as particularidades desse arquivo ou diretrio.
Ao verificar a existncia de um arquivo, h trs resultados possveis:
Constata-se que o arquivo existe.
Constata-se que o arquivo no existe.
O status do arquivo desconhecido. Esse resultado pode ocorrer quando o programa
no tem acesso ao arquivo.
Observao: !Files.exists(path) no equivalente a Files.notExists(path). Se
exists e notExists retornarem false, a existncia do arquivo ou diretrio no poder ser
determinada. Por exemplo, no Windows, possvel conseguir isso solicitando o status de
uma unidade off-line, como uma unidade de CD-ROM.
Programao Java SE 7 11 - 21
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Verificando um Arquivo ou Diretrio
Para verificar que um arquivo pode ser acessado, a classe
Files fornece os seguintes mtodos boolean.
isReadable (Path)
isWriteable (Path)
isExecutable (Path)
Observe que esses testes no so atmicos em relao
a outras operaes do sistema de arquivos. Portanto,
os resultados desses testes possivelmente no sero
confiveis quando os mtodos forem concludos.
O mtodo isSameFile (Path, Path) verifica se os
dois caminhos apontam para o mesmo arquivo. Isso
particularmente til nos sistemas de arquivos que
suportam links simblicos.
O resultado de qualquer um desses testes fica imediatamente desatualizado depois que a
operao concluda. De acordo com a documentao: Observe que o resultado desse
mtodo fica imediatamente desatualizado. No h nenhuma garantia de que uma tentativa
subsequente de abertura do arquivo para gravao ser bem-sucedida (ou at mesmo de
que ela acessar o mesmo arquivo). Tenha cuidado ao usar esse mtodo em aplicativos
protegidos.
Programao Java SE 7 11 - 22
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Criando Arquivos e Diretrios
Os arquivos e diretrios podem ser criados por meio de um
destes mtodos:
Files.createFile (Path dir);
Files.createDirectory (Path dir);
O mtodo createDirectories pode ser usado para
criar diretrios que no existem, de cima para baixo:
Files.createDirectories(Paths.get("D:/Temp/foo/bar/example"));
A classe Files tambm tem mtodos para criar arquivos e diretrios temporrios, links
fsicos e links simblicos.
Programao Java SE 7 11 - 23
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Deletando um Arquivo ou Diretrio
possvel deletar arquivos, diretrios ou links. A classe Files
fornece dois mtodos:
delete(Path)
deleteIfExists(Path)
//...
Files.delete(path);
//...
Lana uma NoSuchFileException,
DirectoryNotEmptyException ou
IOException
//...
Files.deleteIfExists(Path)
//...
Nenhuma exceo lanada
O mtodo delete(Path) deleta o arquivo ou lana uma exceo caso a deleo apresente
falha. Por exemplo, se o arquivo no existir, uma NoSuchFileException ser lanada.
O mtodo deleteIfExists(Path) tambm deleta o arquivo mas, se o arquivo no existir,
nenhuma exceo ser lanada. A falha silenciosa til quando h vrios threads deletando
arquivos e voc no deseja lanar uma exceo apenas porque um thread fez isso primeiro.
Programao Java SE 7 11 - 24
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Copiando um Arquivo ou Diretrio
possvel copiar um arquivo ou diretrio usando o mtodo
copy(Path, Path, CopyOption...).
Quando os diretrios so copiados, os arquivos existentes
no diretrio no so copiados.
Exemplo:
//...
copy(Path, Path, CopyOption...)
//...
REPLACE_EXISTING
COPY_ATTRIBUTES
NOFOLLOW_LINKS
Parmetros StandardCopyOption
import static java.nio.file.StandardCopyOption.*;
//...
Files.copy(source, target, REPLACE_EXISTING, NOFOLLOW_LINKS);
possvel copiar um arquivo ou diretrio usando o mtodo copy(Path, Path,
CopyOption...). A cpia apresentar falha se o arquivo de destino existir, a menos que a
opo REPLACE_EXISTING seja especificada.
Os diretrios podem ser copiados. No entanto, os arquivos existentes no diretrio no so
copiados; portanto, o novo diretrio ficar vazio mesmo quando o diretrio original contiver
arquivos.
Quando um link simblico copiado, o destino do link copiado. Se voc quiser copiar o
prprio link, e no o contedo do link, especifique a opo NOFOLLOW_LINKS ou
REPLACE_EXISTING.
As seguintes enumeraes StandardCopyOption e LinkOption so suportadas:
REPLACE_EXISTING: Faz a cpia at mesmo quando o arquivo de destino j existe.
Se o destino for um link simblico, o prprio link copiado (e no o destino do link). Se
o destino no for um diretrio que no est vazio, a cpia apresentar falha com a
exceo FileAlreadyExistsException.
COPY_ATTRIBUTES: Copia os atributos de arquivo associados ao arquivo para o
arquivo de destino. Os atributos de arquivo exatos suportados so dependentes de
sistema e de plataforma, mas a hora da ltima modificao suportada entre
plataformas e copiada para o arquivo de destino.
NOFOLLOW_LINKS: Indica que os links simblicos no devem ser seguidos. Se o
arquivo a ser copiado for um link simblico, o link ser copiado (e no o destino do link).
Programao Java SE 7 11 - 25
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Copiando Entre um Fluxo e um Caminho
Talvez tambm seja necessrio copiar (ou gravar) de um Stream
para um arquivo ou de um arquivo para um Stream.
A classe Files fornece dois mtodos para facilitar isso:
copy(InputStream source, Path target, CopyOption... options)
copy(Path source, OutputStream out)
Uma forma interessante de usar o primeiro mtodo realizar
a cpia de uma pgina da Web e salvar em um arquivo:
Path path = Paths.get("D:/Temp/oracle.html");
URI u = URI.create("http://www.oracle.com/");
try (InputStream in = u.toURL().openStream()) {
Files.copy(in, path, StandardCopyOption.REPLACE_EXISTING);
} catch (final MalformedURLException | IOException e) {
System.out.println("Exception: " + e);
}
A alternativa para a cpia de fluxo para caminho (stream-to-path) um mtodo de caminho
para fluxo (path-to-stream). Esse mtodo pode ser usado para gravar um arquivo em um
soquete, ou algum outro tipo de fluxo.
Programao Java SE 7 11 - 26
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Movendo um Arquivo ou Diretrio
possvel mover um arquivo ou diretrio usando o
mtodo move(Path, Path, CopyOption...).
A movimentao de um diretrio no mover o contedo
do diretrio.
Exemplo:
//...
move(Path, Path, CopyOption...)
//...
REPLACE_EXISTING
ATOMIC_MOVE
Parmetros StandardCopyOption
import static java.nio.file.StandardCopyOption.*;
//...
Files.move(source, target, REPLACE_EXISTING);
Diretrizes para movimentaes:
Se o caminho de destino for um diretrio e esse diretrio estiver vazio, a movimentao
ser bem-sucedida se REPLACE_EXISTING for definido.
Se o diretrio de destino no existir, a movimentao ser bem-sucedida. Basicamente,
essa uma renomeao do diretrio.
Se o diretrio de destino existir e no estiver vazio, uma
DirectoryNotEmptyException ser lanada.
Se a origem for um arquivo e o destino for um diretrio que j existe, e
REPLACE_EXISTING for definido, a movimentao renomear o arquivo para o nome
de diretrio pretendido.
Para mover um diretrio que contm o arquivo para outro diretrio, o que voc precisar
fazer basicamente ser copiar o contedo do diretrio e, em seguida, deletar o diretrio
antigo.
Tambm possvel executar a movimentao como uma operao de arquivo atmica
usando ATOMIC_MOVE.
Se o sistema de arquivo no suportar uma movimentao atmica, uma exceo ser
lanada. Com ATOMIC_MOVE, possvel mover um arquivo para um diretrio e receber
a garantia de que qualquer processo que est observando o diretrio acessar um
arquivo completo.
Programao Java SE 7 11 - 27
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Listando o Contedo de um Diretrio
A classe DirectoryStream fornece um mecanismo que far
a iterao em todas as entradas de um diretrio.
1 Path dir = Paths.get("D:/Temp");
2 // DirectoryStream is a stream, so use try-with-resources
3 // or explicitly close it when finished
4 try (DirectoryStream<Path> stream =
5 Files.newDirectoryStream(dir, "*.zip")) {
6 for (Path file : stream) {
7 System.out.println(file.getFileName());
8 }
9 } catch (PatternSyntaxException | DirectoryIteratorException |
10 IOException x) {
11 System.err.println(x);
12 }
DirectoryStream escalonado para suportar
diretrios muito grandes.
A classe Files fornece um mtodo para retornar um DirectoryStream, que pode ser
usado para fazer a iterao em todos os arquivos e diretrios de qualquer diretrio Path
(raiz).
DirectoryIteratorException ser lanada se houver um erro de E/S durante a
iterao nas entradas do diretrio especificado.
PatternSyntaxException ser lanado quando o padro fornecido (segundo argumento
do mtodo) for invlido.
Programao Java SE 7 11 - 28
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Lendo/Gravando Todos os Bytes
ou Linhas em um Arquivo
O mtodo readAllBytes ou readAllLines l todo
o contedo do arquivo em uma nica passagem.
Exemplo:
Use o(s) mtodo(s) write para gravar bytes ou linhas em
um arquivo.
Path source = ...;
List<String> lines;
Charset cs = Charset.defaultCharset();
lines = Files.readAllLines(file, cs);
Path target = ...;
Files.write(target, lines, cs, CREATE, TRUNCATE_EXISTING, WRITE);
EnumeraesStandardOpenOption
.
Se voc tiver um arquivo pequeno e quiser ler todo o seu contedo em uma nica passagem,
poder usar o mtodo readAllBytes(Path) ou readAllLines(Path, Charset).
Esses mtodos do conta da maioria do trabalho, como abertura e fechamento do fluxo; mas,
como eles ativam o arquivo inteiro de uma s vez, no se destinam manipulao de
arquivos grandes.
Use um dos mtodos de gravao para gravar bytes ou linhas em um arquivo.
write(Path, byte[], OpenOption...)
write(Path, Iterable<? extends CharSequence>, Charset,
OpenOption...)
Programao Java SE 7 11 - 29
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Canais e ByteBuffers
A E/S de fluxo l um caractere por vez, enquanto a E/S de
canal l um buffer por vez.
A interface ByteChannel oferece funcionalidade bsica
de leitura e gravao.
Um SeekableByteChannel um ByteChannel que
tem capacidade para manter uma posio no canal e
alter-la.
Estes so os dois mtodos de leitura e gravao de E/S
de canal:
A capacidade de mover-se para diferentes pontos no
arquivo e, em seguida, ler e gravar nesse local possibilita
o acesso aleatrio a um arquivo.
newByteChannel(Path, OpenOption...)
newByteChannel(Path, Set<? extends OpenOption>, FileAttribute<?>...)
O NIO.2 suporta canal e E/S de fluxo em buffer.
Embora a E/S de fluxo leia um caractere por vez, a E/S de canal l um buffer por vez. A
interface ByteChannel oferece funcionalidade bsica de leitura e gravao. Um
SeekableByteChannel um ByteChannel que tem capacidade para manter uma
posio no canal e consultar o arquivo para saber seu tamanho.
A capacidade de mover-se para diferentes pontos no arquivo e, em seguida, ler e gravar
nesse local possibilita o acesso aleatrio a um arquivo.
Estes so os dois mtodos de leitura e gravao na E/S de canal:
newByteChannel(Path, OpenOption...)
newByteChannel(Path, Set<? extends OpenOption>,
FileAttribute<?>...)
Observao: Os mtodos newByteChannel retornam uma instncia de um
SeekableByteChannel. Com um sistema de arquivos padro, possvel converter esse
canal de bytes pesquisvel em um FileChannel, fornecendo acesso a recursos mais
avanados, como o mapeamento de uma regio do arquivo diretamente para a memria a
fim de obter um acesso mais rpido, bloqueando uma regio do arquivo para que outros
processos no consigam acess-lo, ou lendo e gravando bytes em uma posio absoluta
sem afetar a posio atual do canal. Consulte a lio Fundamentos de E/S para obter um
exemplo do uso de FileChannel.
Programao Java SE 7 11 - 30
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Arquivos de Acesso Aleatrio
Os arquivos de acesso aleatrio permitem o acesso no
sequencial ou aleatrio ao contedo de um arquivo.
Para acessar um arquivo aleatoriamente, abra o arquivo,
procure um local especfico e leia ou grave esse arquivo.
A funcionalidade de acesso aleatrio ativada pela
interface SeekableByteChannel.
position()
position(long)
read(ByteBuffer)
write(ByteBuffer)
truncate(long)
Os arquivos de acesso aleatrio permitem o acesso no sequencial ou aleatrio ao contedo
de um arquivo. Para acessar um arquivo aleatoriamente, abra o arquivo, procure um local
especfico e leia ou grave esse arquivo.
Essa funcionalidade possvel com a interface SeekableByteChannel. A interface
SeekableByteChannel estende a E/S de canal com a noo de uma posio atual. Os
mtodos permitem definir ou consultar a posio, e voc pode ler os dados, ou grav-los,
nesse local. A API consiste em alguns mtodos fceis de usar:
position(): Retorna a posio atual do canal
position(long): Define a posio do canal
read(ByteBuffer): L bytes do canal para o buffer
write(ByteBuffer): Grava bytes do buffer para o canal
truncate(long): Trunca o arquivo (ou outra entidade) conectada ao canal
Programao Java SE 7 11 - 31
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Mtodos de E/S em Buffer para Arquivos de Texto
O mtodo newBufferedReader abre um arquivo para
leitura.
O mtodo newBufferedWriter grava um arquivo
usando um BufferedWriter.
//...
BufferedReader reader = Files.newBufferedReader(file, charset);
line = reader.readLine();
//...
BufferedWriter writer = Files.newBufferedWriter(file, charset);
writer.write(s, 0, s.length());
Lendo um Arquivo por Meio da E/S de Fluxo em Buffer
O mtodo newBufferedReader(Path, Charset) abre um arquivo para leitura,
retornando um BufferedReader que pode ser usado para ler texto em um arquivo com
mais eficincia.
Programao Java SE 7 11 - 32
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Fluxos de Bytes
O NIO.2 tambm suporta mtodos para abrir fluxos de bytes.
Para criar um arquivo, faa um acrscimo a um arquivo
ou grave um arquivo, use o mtodo newOutputStream.
InputStream in = Files.newInputStream(file);
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
line = reader.readLine();
import static java.nio.file.StandardOpenOption.*;
//...
Path logfile = ...;
String s = ...;
byte data[] = s.getBytes();
OutputStream out =
new BufferedOutputStream(file.newOutputStream(CREATE, APPEND);
out.write(data, 0, data.length);
Programao Java SE 7 11 - 33
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Gerenciando Metadados
Mtodo Explicao
size
Retorna o tamanho do arquivo especificado em bytes
isDirectory
Retornar true se o Path especificado localizar um arquivo
que um diretrio
isRegularFile
Retornar true se o Path especificado localizar um arquivo
regular
isSymbolicLink
Retornar true se o Path especificado localizar um arquivo
que um link simblico
isHidden
Retornar true se o Path especificado localizar um arquivo
que considerado oculto pelo sistema de arquivos
getLastModifiedTime
Retorna ou define a hora da ltima modificao do arquivo
especificado
setLastModifiedTime
getAttribute
Retorna ou define o valor de um atributo de arquivo
setAttribute
Se um programa precisar de vrios atributos de arquivo ao mesmo tempo, possivelmente no
ser eficaz usar mtodos que recuperem um nico atributo. Acessar vrias vezes o sistema
de arquivos para recuperar um nico atributo pode prejudicar o desempenho. Por esse
motivo, a classe Files fornece dois mtodos readAttributes para extrair os atributos de
um arquivo em uma nica operao em massa.
readAttributes(Path, String, LinkOption...)
readAttributes(Path, Class<A>, LinkOption...)
Programao Java SE 7 11 - 34
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Atributos de Arquivo (DOS)
Os atributos de arquivo podem ser lidos em um arquivo
ou diretrio em uma nica chamada:
DosFileAttributes attrs =
Files.readAttributes (path, DosFileAttributes.class);
Os sistemas de arquivos DOS podem modificar atributos
aps a criao do arquivo:
Files.createFile (file);
Files.setAttribute (file, "dos:hidden", true);
Os tipos setAttribute (para DOS) estendem a BasicFileAttributeView e exibem os
quatro bits padro nos sistemas de arquivos que suportam atributos do DOS:
dos:hidden
dos:readonly
dos:system
dos:archive
Outras views de atributo suportadas incluem:
BasicFileAttributeView: Fornece um conjunto de atributos bsicos suportados
por todas as implementaes do sistema de arquivos
PosixFileAttributeView: Estende a BasicFileAttributeView com atributos
que suportam a famlia POSIX de padres, como o UNIX
FileOwnerAttributeView: suportado por qualquer implementao do sistema de
arquivos que suporta o conceito de um proprietrio de arquivo
AclFileAttributeView: Suporta a leitura ou atualizao da Lista de Controle de
Acesso (ACL) de um arquivo. O modelo de ACL NFSv4 suportado.
UserDefinedFileAttributeView: Permite o suporte aos metadados definidos pelo
usurio
Programao Java SE 7 11 - 35
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Atributos de Arquivo DOS: Exemplo
DosFileAttributes attrs = null;
Path file = ...;
try { attrs =
Files.readAttributes(file, DosFileAttributes.class);
} catch (IOException e) { ///... }
FileSystem creation = attrs.creationTime();
FileSystem modified = attrs.lastModifiedTime();
FileSystem lastAccess = attrs.lastAccessTime();
if (!attrs.isDirectory()) {
long size = attrs.size();
}
// DosFileAttributes adds these to BasicFileAttributes
boolean archive = attrs.isArchive();
boolean hidden = attrs.isHidden();
boolean readOnly = attrs.isReadOnly();
boolean systemFile = attrs.isSystem();
O fragmento de cdigo no slide ilustra o uso da classe DosFileAttributes. Na primeira
chamada para o mtodo readAttributes, os atributos do arquivo (ou diretrio) so
retornados.
Programao Java SE 7 11 - 36
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Permisses da POSIX
Com o NIO.2, possvel criar arquivos e diretrios nos
sistemas de arquivos POSIX com seu conjunto de permisses
iniciais.
1 Path p = Paths.get(args[0]);
2 Set<PosixFilePermission> perms =
3 PosixFilePermissions.fromString("rwxr-x---");
4 FileAttribute<Set<PosixFilePermission>> attrs =
5 PosixFilePermissions.asFileAttribute(perms);
6 try {
7 Files.createFile(p, attrs);
8 } catch (FileAlreadyExistsException f) {
9 System.out.println("FileAlreadyExists" + f);
10 } catch (IOException i) {
11 System.out.println("IOException:" + i);
12 }
Crie um arquivo no Path
p com atributos opcionais.
Os sistemas de arquivos que implementam o padro da Interface de Sistema Operacional
Porttil (POSIX) pode criar arquivos e diretrios com seu conjunto de permisses iniciais.
Isso resolve um problema comum na programao de E/S em que um arquivo criado. As
permisses nesse arquivo podem ser alteradas antes da prxima execuo para definir
permisses.
As permisses podem ser definidas somente para sistemas de arquivos compatveis com a
POSIX, como MacOS, Linux e Solaris. O Windows (baseado em DOS) no compatvel com
a POSIX. Os arquivos e diretrios baseados em DOS no tm permisses, mas atributos de
arquivo.
Observao: possvel determinar se um sistema de arquivos suportar a POSIX de modo
programtico procurando quais views de atributo de arquivo so suportadas. Por exemplo:
boolean unixFS = false;
Set<String> views =
FileSystems.getDefault().supportedFileAttributeViews();
for (String s : views) {
if (s.equals("posix")) unixFS = true;
}
Programao Java SE 7 11 - 37
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Considerando o seguinte fragmento:
Path p1 = Paths.get("/export/home/peter");
Path p2 = Paths.get("/export/home/peter2");
Files.move(p1, p2, StandardCopyOption.REPLACE_EXISTING);
Se o diretrio peter2 no existir, e o diretrio peter for
preenchido com subpastas e arquivos, qual ser o resultado?
a. DirectoryNotEmptyException
b. NotDirectoryException
c. O diretrio peter2 criado.
d. O diretrio peter copiado para peter2.
e. O diretrio peter2 criado e preenchido com arquivos
e diretrios de peter.
Programao Java SE 7 11 - 38
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Considerando este fragmento:
Path source = Paths.get(args[0]);
Path target = Paths.get(args[1]);
File.copy(source, target);
Assumindo que source e target no so diretrios,
como ser possvel impedir que essa operao de cpia
gere FileAlreadyExistsException?
a. Delete o arquivo target antes da cpia.
b. Use o mtodo move.
c. Use o mtodo copyExisting.
d. Adicione a opo REPLACE_EXISTING ao mtodo.
Programao Java SE 7 11 - 39
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Considerando este fragmento:
Path source = Paths.get("/export/home/mcginn/HelloWorld.java");
Path newdir = Paths.get("/export/home/heimer");
Files.copy(source, newdir.resolve(source.getFileName());
Assumindo que no h excees, qual ser o resultado?
a. O contedo de mcginn copiado para heimer.
b. HelloWorld.java copiado para /export/home.
c. HelloWorld.java copiado para
/export/home/heimer.
d. O contedo de heimer copiado para mcginn.
Programao Java SE 7 11 - 40
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exerccio 11-1 - Viso Geral:
Gravando uma Aplicao de Intercalao de Arquivo
Neste exerccio, use a interface Path e a classe Files para
abrir um formulrio de modelo da carta e substitua o nome no
modelo pelo nome de um arquivo que contm uma lista de
nomes.
Use a interface Path para criar um novo nome de arquivo
para a carta personalizada.
Use a classe Files para ler todas as strings em ambos
os arquivos nos objetos List.
Use as classes Matcher e Pattern para
procurar o token a ser substitudo no modelo.
Programao Java SE 7 11 - 41
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Operaes Recursivas
A classe Files fornece um mtodo para percorrer a rvore de
arquivos em operaes recursivas, como cpias e delees.
walkFileTree (Path start, FileVisitor<T>)
Exemplo:
public class PrintTree implements FileVisitor<Path> {
public FileVisitResult preVisitDirectory(Path, BasicFileAttributes){}
public FileVisitResult postVisitDirectory(Path, BasicFileAttributes){}
public FileVisitResult visitFile(Path, BasicFileAttributes){}
public FileVisitResult visitFileFailed(Path, BasicFileAttributes){}
}
public class WalkFileTreeExample {
public printFileTree(Path p) {
Files.walkFileTree(p, new PrintTree());
}
}
A rvore de arquivos explorada
recursivamente. Os mtodos definidos
por PrintTree so chamados quando
os diretrios e arquivos so acessados
na rvore. Cada mtodo passa o
caminho atual como primeiro
argumento do mtodo.
A interface FileVisitor inclui mtodos que so chamados medida que cada n em uma
rvore de arquivos visitado:
preVisitDirectory: Chamado em um diretrio antes que as entradas do diretrio
sejam visitadas
visitFile: Chamado para um arquivo em um diretrio
postVisitDirectory: Chamado depois que todas as entradas em um diretrio e
seus descendentes so visitadas
visitFileFailed: Chamado para um arquivo que no pde ser visitado
O resultado de retorno de cada um dos mtodos chamados determina as aes realizadas
depois que um n acessado (antes ou depois). Elas so enumeradas na classe
FileVisitResult:
CONTINUE: Continue at o prximo n
SKIP_SIBLINGS: Continue sem visitar os irmos desse arquivo ou diretrio
SKIP_SUBTREE: Continue sem visitar as entradas nesse diretrio
TERMINATE
Observao: Existe tambm uma classe, SimpleFileVisitor, que implementa cada
mtodo em FileVisitor com o tipo de retorno FileVisitResult.CONTINUE ou lana
novamente qualquer IOException. Se voc pretende usar somente alguns mtodos na
interface FileVisitor, essa classe ser mais fcil de estender e substituir apenas os
mtodos necessrios.
Programao Java SE 7 11 - 42
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Ordem de Mtodo FileVisitor
start
file
dir
link
file
file
preVisitDirectory()
dir
FileVisitor
Comeando pelo primeiro n de diretrio, e a cada subdiretrio encontrado, o mtodo
preVisitDirectory(Path, BasicFileAttributes) chamado na classe passada
para o mtodo walkFileTree.
Assumindo que o tipo de retorno da chamada preVisitDirectory() retornar
FileVisitResult.CONTINUE, o prximo n ser explorado.
Observao: O percurso da rvore de arquivos segue uma ordem depth-first (em
profundidade) com o mtodo FileVisitor especfico chamado para cada arquivo
encontrado. O percurso da rvore de arquivos ser concludo quando todos os arquivos
acessveis forem visitados ou quando um mtodo de visita retornar o resultado TERMINATE.
Quando um mtodo de visita for encerrado devido a uma IOException, um erro no
capturado ou uma exceo de runtime, o percurso ser encerrado, e o erro ou a exceo
ser propagado para o chamador desse mtodo.
Programao Java SE 7 11 - 43
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
start
file
dir
link
file
file
dir
Ordem de Mtodo FileVisitor
visitFileFailed()
visitFile()
preVisitDirectory()
visitFile()
preVisitDirectory()
Quando um arquivo encontrado na rvore, o mtodo walkFileTree tenta ler seus
BasicFileAttributes. Se o arquivo no for um diretrio, o mtodo visitFile ser
chamado com os atributos de arquivo. Se os atributos de arquivo no puderem ser lidos,
devido a uma exceo de E/S, o mtodo visitFileFailed ser chamado com a exceo
de E/S.
.
Programao Java SE 7 11 - 44
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
start
file
dir
link
file
file
dir
Ordem de Mtodo FileVisitor
postVisitDirectory()
postVisitDirectory()
postVisitDirectory()
postVisitDirectory()
Depois que todos os filhos em um n forem acessados, o mtodo postVisitDirectory
ser chamado em cada um dos diretrios.
Observao: A progresso ilustrada aqui assume que o tipo de retorno FileVisitResult
CONTINUE para cada um dos mtodos FileVisitor.
Programao Java SE 7 11 - 45
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exemplo: WalkFileTreeExample
Path path = Paths.get("D:/Test");
try {
Files.walkFileTree(path, new PrintTree());
} catch (IOException e) {
System.out.println("Exception: " + e);
}
D:\Test
file1
a
bar
file3
file2
foo
Neste exemplo, a classe PrintTree implementa cada um dos mtodos no FileVisitor e
imprime o tipo, o nome e o tamanho do diretrio e do arquivo em cada n. Usando o
diagrama mostrado no slide, a sada resultante (no Windows) mostrada a seguir:
preVisitDirectory: Directory: D:\Test (0 bytes)
preVisitDirectory: Directory: D:\Test\bar (0 bytes)
postVisitDirectory: Directory: D:\Test\bar
visitFile: Regular file: D:\Test\file1 (328 bytes)
preVisitDirectory: Directory: D:\Test\foo (0 bytes)
preVisitDirectory: Directory: D:\Test\foo\a (0 bytes)
visitFile: Regular file: D:\Test\foo\a\file2 (22 bytes)
postVisitDirectory: Directory: D:\Test\foo\a
visitFile: Regular file: D:\Test\foo\file3 (12 bytes)
postVisitDirectory: Directory: D:\Test\foo
postVisitDirectory: Directory: D:\Test
O cdigo completo esse exemplo est no projeto examples/WalkFileTreeExample.
Programao Java SE 7 11 - 46
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Localizando Arquivos
Para localizar um arquivo, geralmente voc pesquisar um diretrio.
possvel usar uma ferramenta de pesquisa ou um comando, como:
dir /s *.java
Esse comando procurar recursivamente na rvore de
diretrios, a partir do local em que voc est, todos os arquivos
que contm a extenso .java.
A interface java.nio.file.PathMatcher inclui um mtodo de
correspondncia para determinar se um objeto Path corresponde
a uma string de pesquisa especificada.
Cada implementao de sistema de arquivos fornece um
PathMatcher que pode ser recuperado por meio da fbrica
FileSystems:
PathMatcher matcher = FileSystems.getDefault().getPathMatcher
(String syntaxAndPattern);
Programao Java SE 7 11 - 47
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Sintaxe e Padro do PathMatcher
A string syntaxAndPattern tem o seguinte formato:
sintaxe:padro
Em que sintaxe pode ser glob e regex.
A sintaxe glob similar s expresses regulares, mas ela mais
simples:
Exemplo do Padro Correspondncias
*.java
Um caminho que representa um nome de arquivo que termina
com .java
*.*
Corresponde aos nomes de arquivo que contm um ponto
*.{java,class} Corresponde aos nomes de arquivo que terminam com .java
ou .class
foo.? Corresponde aos nomes de arquivo que comeam com foo. e
uma nica extenso de caractere
C:\\* Corresponde a C:\foo e C:\bar na plataforma Windows
(Observe que a barra invertida tem escape. Como um literal de
string na Linguagem Java, o padro ser C:\\\\*.)
As regras a seguir so usadas para interpretar padres glob:
O caractere * corresponde a zero ou mais caracteres de um componente de nome, sem
ultrapassar os limites do diretrio.
Os caracteres ** corresponde a zero ou mais caracteres ultrapassando os limites do
diretrio.
O caractere ? corresponde exatamente a um caractere de um componente de nome.
O caractere de barra invertida (\) usado para fazer o escape dos caracteres que
seriam interpretados como caracteres especiais. A expresso \\ corresponde a uma
barra invertida nica e \{ corresponde a uma chave de abertura, por exemplo.
Os caracteres [ ] so uma expresso entre colchetes que corresponde a um nico
caractere de um componente de nome extrado de um conjunto de caracteres. Por
exemplo, [abc] corresponde a a, b ou c. O hfen (-) pode ser usado para especificar
uma faixa; portanto, [a-z] especifica uma faixa que vai de a a z (inclusive). Esses
formatos podem se misturar; portanto [abce-g] corresponde a a, b, c, e, f ou g. Se o
caractere aps [ for um !, ele ser usado para negao; portanto, [!a-c]
corresponde a qualquer caractere, exceto a, b ou c.
Programao Java SE 7 11 - 48
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Em uma expresso entre colchetes, os caracteres *, ? e \ correspondem a si mesmos.
O caractere (-) corresponder a si mesmo se for o primeiro caractere entre colchetes ou
ao primeiro caractere aps o ! se estiver fazendo uma negao.
Os caracteres { } so um grupo de subpadres, em que o grupo ser correspondente se
algum subpadro do grupo for correspondente. O caractere "," usado para separar os
subpadres. Os grupos no podem ser aninhados.
Os caracteres de ponto esquerda em um nome de arquivo so tratados como
caracteres regulares em operaes de correspondncia. Por exemplo, o padro glob *
corresponde a um nome de arquivo .login. O mtodo
Files.isHidden(java.nio.file.Path) pode ser usado para testar se um
arquivo considerado oculto.
Todos os outros caracteres correspondem a si mesmos de uma maneira dependente de
implementao. Isso inclui caracteres que representam qualquer separador de nome.
A correspondncia dos componentes raiz altamente dependente de implementao e
no especificada.
Quando a sintaxe regex, o componente de padro uma expresso regular conforme
definido pela classe Pattern.
Nas sintaxes glob e regex, os detalhes da correspondncia (por exemplo, se a
correspondncia faz distino entre maisculas e minsculas) dependem da implementao
e, portanto, no so especificados.
Programao Java SE 7 11 - 49
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
PathMatcher: Exemplo
1 public static void main (String[] args) {
2 // ... check for two arguments
3 Path root = Paths.get(args[0]);
4 // ... check that the first argument is a directory
5 PathMatcher matcher =
6 FileSystems.getDefault().getPathMatcher("glob:" + args[1]);
7 // Finder is class that implements FileVisitor
8 Finder finder = new Finder(root, matcher);
9 try {
10 Files.walkFileTree(root, finder);
11 } catch (IOException e) {
12 System.out.println("Exception: " + e);
13 }
14 finder.done();
15 }
Neste fragmento de cdigo no slide (o exemplo completo est no diretrio de exemplos), dois
argumentos so passados para main.
O primeiro argumento ser testado para verificar se ele um diretrio. O segundo argumento
usado para criar uma instncia PathMatcher com uma expresso regular usando a
fbrica FileSystems.
Finder uma classe que implementa a interface FileVisitor, para que ela possa ser
passada para um mtodo walkFileTree. Essa classe usada para chamar o mtodo de
correspondncia em cada arquivo visitado na rvore.
Programao Java SE 7 11 - 50
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Classe Finder
1 public class Finder extends SimpleFileVisitor<Path> {
2 private Path file;
3 private PathMatcher matcher;
4 private int numMatches;
5 // ... constructor stores Path and PathMatcher objects
6 private void find(Path file) {
7 Path name = file.getFileName();
8 if (name != null && matcher.matches(name)) {
9 numMatches++;
10 System.out.println(file);
11 }
12 }
13 @Override
14 public FileVisitResult visitFile(Path file,
15 BasicFileAttributes attrs) {
16 find(file);
17 return CONTINUE;
18 }
19 //...
20 }
O slide mostra uma parte da classe Finder. Essa classe usada para percorrer a rvore e
procurar correspondncias entre arquivo e o arquivo acessado pelo mtodo visitFile.
Programao Java SE 7 11 - 51
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Outras Classes teis do NIO.2
A classe FileStore til para fornecer informaes de
uso sobre um sistema de arquivos, como total, capacidade
de uso e espao em disco alocado.
Filesystem kbytes used avail
System (C:) 209748988 72247420 137501568
Data (D:) 81847292 429488 81417804
Uma instncia da interface WatchService pode ser
usada para relatar as alteraes feitas nos objetos Path
registrados. WatchService pode ser usado para
identificar quando os arquivos so adicionados, deletados
ou modificados em um diretrio.
ENTRY_CREATE: D:\test\New Text Document.txt
ENTRY_CREATE: D:\test\Foo.txt
ENTRY_MODIFY: D:\test\Foo.txt
ENTRY_MODIFY: D:\test\Foo.txt
ENTRY_DELETE: D:\test\Foo.txt
O slide mostra a sada de exemplos dos projetos DiskUsageExample e
WatchDirExample.
Programao Java SE 7 11 - 52
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Movendo para NIO.2
Um mtodo foi adicionado classe java.io.File para que
o JDK 7 fornea compatibilidade com verses posteriores ao
NIO.2.
Path path = file.toPath();
Isso permite que voc tire proveito do NIO.2 sem precisar
regravar uma grande quantidade de cdigo.
Alm disso, voc pode substituir o cdigo existente para
melhorar a manuteno futura; por exemplo, substituir
file.delete(); por:
Path path = file.toPath();
Files.delete(path);
Por outro lado, a interface Path fornece um mtodo para
construir um objeto java.io.File:
File file = path.toFile();
Cdigo java.io.File legado
Um dos benefcios do pacote NIO.2 que voc pode ativar o cdigo legado para tirar
proveito da nova API.
Programao Java SE 7 11 - 53
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Resumo
Nesta lio, voc aprendeu a:
Usar a interface Path para operar em caminhos de
arquivo e diretrio
Usar a classe Files para verificar, deletar, copiar ou
mover um arquivo ou diretrio
Usar mtodos da classe Files para ler e gravar arquivos
usando a E/S de canal e de fluxo
Ler e alterar atributos de arquivo e diretrio
Acessar recursivamente uma rvore de diretrios
Localizar um arquivo usando a classe
PathMatcher
Programao Java SE 7 11 - 54
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Para copiar, mover ou abrir um arquivo ou diretrio usando
o NIO.2, primeiro necessrio criar uma instncia de:
a. Path
b. Files
c. FileSystem
d. Channel
Programao Java SE 7 11 - 55
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Dado qualquer caminho de diretrio inicial, qual(is) mtodo(s)
FileVisitor deve(m) ser usado(s) para deletar uma rvore
de arquivos?
a. preVisitDirectory()
b. postVisitDirectory()
c. visitFile()
d. visitDirectory()
Programao Java SE 7 11 - 56
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Considerando uma aplicao na qual voc deseja contabilizar
a profundidade de uma rvore de diretrios (quantos nveis de
diretrios), qual mtodo FileVisitor deve ser usado?
a. preVisitDirectory()
b. postVisitDirectory()
c. visitFile()
d. visitDirectory()
Programao Java SE 7 11 - 57
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exerccio 11-2 - Viso Geral:
Cpia Recursiva
Este exerccio aborda a criao de uma classe implementando
FileVisitor para copiar recursivamente uma rvore de
diretrios para outro local.
Permite que o usurio da aplicao decida se substituir
ou no um diretrio existente.
Programao Java SE 7 11 - 58
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
(Opcional) Exerccio 11-3 - Viso Geral:
Usando PathMatcher para Deletar Recursivamente
Este exerccio aborda os seguintes tpicos:
Criao de uma classe por meio da implementao
de FileVisitor para deletar um arquivo usando um
curinga (ou seja, deletar todos os arquivos de texto
usando *.txt.)
(Opcional) Execuo de WatchDirExample no diretrio
de exemplos durante a deleo de arquivos de um
diretrio (ou a aplicao de cpia recursiva) para
inspecionar as alteraes
Programao Java SE 7 11 - 59
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Threading
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Objetivos
Aps concluir esta lio, voc ser capaz de:
Descrever o agendamento de tarefas do sistema
operacional
Definir um thread
Criar threads
Gerenciar threads
Sincronizar threads acessando dados compartilhados
Identificar problemas de threading potenciais
Programao Java SE 7 12 - 2
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Agendamento de Tarefas
Os sistemas operacionais modernos usam multitarefas
preventivas para alocar o tempo da CPU nas aplicaes.
Existem dois tipos de tarefas que podem ser agendadas para
execuo:
Processos: Um processo uma rea da memria que
contm cdigo e dados. Um processo tem um thread de
execuo que agendado para receber fraes de tempo
da CPU.
Thread: Um thread a execuo agendada de um
processo. Os threads concorrentes so possveis. Todos
os threads de um processo compartilham a mesma
memria de dados, mas podem estar seguindo caminhos
diferentes em uma seo de cdigo.
Multitarefas Preventivas
Os computadores modernos geralmente tm mais tarefas a serem executadas do que as
CPUs. Cada tarefa recebe um perodo de tempo (denominado frao de tempo) durante o
qual ela pode ser executada em uma CPU. Uma frao de tempo geralmente medida em
milissegundos. Quando a frao de tempo decorrida, a tarefa removida da CPU e outra
tarefa tem chance de ser executada.
Programao Java SE 7 12 - 3
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Por Que o Threading Importante
Para executar um programa o mais rpido possvel, evite
gargalos de desempenho. Estes so alguns dos gargalos:
Disputa de Recurso: Duas ou mais tarefas aguardando
o uso exclusivo de um recursos
Operaes de E/S Bloqueadas: Ociosidade enquanto
aguarda transferncias de dados do disco ou da rede
Baixo Uso de CPUs: Uma aplicao de thread nico usa
apenas uma CPU
Servidores com Vrios Threads
Mesmo se voc no gravar cdigo para criar novos threads de execuo, o cdigo poder
ser executado em um ambiente com vrias threads. Voc deve saber como os threads
funcionam e como gravar cdigo com thread seguro. Ao criar um cdigo que ser executado
em outra parte do software (como um servidor middleware ou de aplicaes), voc deve ler a
documentao dos produtos para descobrir se os threads sero criados automaticamente.
Por exemplo, em um servidor de aplicao Java EE, existe um componente chamado
Servlet, que usado para tratar solicitaes HTTP. Os servlets sempre devem ter thread
seguro porque o servidor inicia um novo thread para cada solicitao HTTP.
Programao Java SE 7 12 - 4
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
A Classe Thread
A classe Thread usada para criar e iniciar threads. O cdigo
a ser executado por um thread deve ser colocado em uma
classe, que realiza uma destas aes:
Estende a classe Thread
Cdigo mais simples
Implementa a interface Runnable
Mais flexvel
extends ainda gratuito.
Programao Java SE 7 12 - 5
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Estendendo o Thread
Estenda java.lang.Thread e substitua o mtodo run:
public class ExampleThread extends Thread {
@Override
public void run() {
for(int i = 0; i < 100; i++) {
System.out.println("i:" + i);
}
}
}
O mtodo run
O cdigo a ser executado em um novo thread de execuo deve ser colocado em um mtodo
run. Evite chamar o mtodo run diretamente. Se voc chamar o mtodo run, um novo
thread no ser iniciado e o efeito ser o mesmo que chamar qualquer outro mtodo.
Programao Java SE 7 12 - 6
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Iniciando um Thread
Aps criar um novo Thread, ele deve ser iniciado chamando
o mtodo start do Thread:
public static void main(String[] args) {
ExampleThread t1 = new ExampleThread();
t1.start();
}
Agenda o mtodo run
a ser chamado
O Mtodo start
O mtodo start usado para iniciar a execuo de um thread. A Java Virtual Machine
chamar o mtodo run do Thread. Voc no tem controle sobre o momento exato em que o
mtodo run comear a ser executado. Um Thread pode ser iniciado somente uma vez.
Programao Java SE 7 12 - 7
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Implementando Runnable
Implemente java.lang.Runnable e implemente o mtodo
run:
public class ExampleRunnable implements Runnable {
@Override
public void run() {
for(int i = 0; i < 100; i++) {
System.out.println("i:" + i);
}
}
}
O Mtodo run
Exatamente como acontece ao estender um Thread, chamar o mtodo run no inicia um
novo thread. A vantagem da implementao de Runnable que ainda possvel estender
uma classe da sua preferncia.
Programao Java SE 7 12 - 8
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Executando Instncias de Runnable
Aps criar um novo Runnable, ele deve ser passado para um
construtor de Thread. O mtodo start do Thread inicia a
execuo:
public static void main(String[] args) {
ExampleRunnable r1 = new ExampleRunnable();
Thread t1 = new Thread(r1);
t1.start();
}
O Mtodo start
O mtodo start do Thread usado para iniciar a execuo de um thread. Depois que o
thread iniciado, a Java Virtual Machine chamar o mtodo run no Runnable associado do
Thread.
Programao Java SE 7 12 - 9
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Um Runnable com Dados Compartilhados
Os campos estticos e de instncia so potencialmente
compartilhados pelos threads.
public class ExampleRunnable implements Runnable {
private int i;
@Override
public void run() {
for(i = 0; i < 100; i++) {
System.out.println("i:" + i);
}
}
}
Varivel
potencialmente
compartilhada
Programao Java SE 7 12 - 10
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Um Runnable: Vrios Threads
Um objeto referenciado por vrios threads pode resultar no
acesso concorrente de campos de instncia.
public static void main(String[] args) {
ExampleRunnable r1 = new ExampleRunnable();
Thread t1 = new Thread(r1);
t1.start();
Thread t2 = new Thread(r1);
t2.start();
}
Uma nica instncia
de Runnable
Vrios Threads com Um Runnable
possvel passar uma nica instncia de Runnable para vrias instncias de Thread. As
instncias de Runnable existentes sero apenas as que voc criar. Vrias instncias de
Thread compartilham os campos da instncia de Runnable.
Os campos estticos tambm podem ser acessados de modo concorrente por vrios threads.
Programao Java SE 7 12 - 11
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
A criao de um novo thread requer o uso de:
a. java.lang.Runnable
b. java.lang.Thread
c. java.util.concurrent.Callable
Programao Java SE 7 12 - 12
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Problemas com Dados Compartilhados
Os dados compartilhados devem ser acessados com cautela.
Campos estticos e de instncia:
So criados em uma rea da memria conhecida como
espao de heap
Podem ser potencialmente compartilhados por qualquer
thread
Podem ser alterados de modo concorrente por vrios threads
No h compilador ou avisos de IDE.
O acesso seguro aos campos compartilhados sua
responsabilidade.
Os slides precedentes podem produzir o seguinte:
i:0,i:0,i:1,i:2,i:3,i:4,i:5,i:6,i:7,i:8,i:9,i:10,i:12,i:11 ...
Fora da sequncia
Zero produzido duas vezes
Depurando Threads
A depurao de threads pode ser difcil porque a frequncia e a durao em que cada thread
alocado pode variar por vrios motivos:
O agendamento do thread tratado por um sistema operacional, e os sistemas
operacionais podem usar diferentes algoritmos de agendamento
As mquinas tem quantidades e velocidades diferentes de CPUs
Outras aplicaes podem sobrecarregando o sistema
Esse um daqueles casos em que uma aplicao demonstra estar em perfeito
funcionamento na fase de desenvolvimento, mas problemas estranhos podem surgir durante
a fase de produo devido s variaes de agendamento. sua responsabilidade
salvaguardar o acesso s variveis compartilhadas.
Programao Java SE 7 12 - 13
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Dados No Compartilhados
Alguns tipos de varivel nunca so compartilhados.
Os seguintes tipos sempre tm thread seguro:
Variveis locais
Parmetros de mtodo
Parmetros de handler de exceo
Dados com Thread Seguro Compartilhados
Quaisquer dados compartilhados imutveis, como objetos String ou campos finais, tm
thread seguro porque s podem ser lidos, e no gravados.
Programao Java SE 7 12 - 14
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
As variveis tero thread seguro se forem:
a. local
b. static
c. final
d. private
Programao Java SE 7 12 - 15
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Operaes Atmicas
As operaes atmicas funcionam como uma operao nica.
Uma nica instruo na linguagem Java nem sempre atmica.
i++;
Cria uma cpia temporria do valor em i
Incrementa a cpia temporria
Grava o novo valor novamente em i
l = 0xffff_ffff_ffff_ffff;
As variveis de 64 bits podem ser acessadas por meio de
duas operaes de 32 bits separadas.
Quais inconsistncias dois threads que esto incrementando
o mesmo campo podem encontrar?
O que fazer se esse campo for longo?
Comportamento Inconsistente
Um problema possvel com dois threads que esto incrementando o mesmo campo a
provvel ocorrncia de uma atualizao perdida. Imagine se os dois threads lerem o valor 41
em um campo, incrementarem esse valor em um e gravarem os resultados novamente no
campo. Ambos os threads tero feito um incremento, mas o valor resultante ser apenas 42.
Dependendo de como a Java Virtual Machine implementada e do tipo de CPU fsica que
est sendo utilizada, talvez voc nunca ou raramente se depare com esse comportamento.
No entanto, sempre assuma que isso pode acontecer.
Se voc tiver o valor longo 0x0000_0000_ffff_ffff e increment-lo em 1, o resultado
dever ser 0x0000_0001_0000_0000. No entanto, como permitido legalmente um campo
de 64 bits ser acessado por meio de duas gravaes de 32 bits separadas, o valor
0x0000_0001_ffff_ffff ou at mesmo 0x0000_0000_0000_0000 pode existir
temporariamente, dependendo de quais bits so modificados primeiro. Se um segundo
thread receber permisso para ler um campo de 64 bits enquanto estiver sendo modificado
por outro thread, um valor incorreto poder ser recuperado.
Programao Java SE 7 12 - 16
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Execuo Fora da Ordem
A execuo das operaes em um thread pode parecer
fora de ordem se voc observar os resultados a partir de
outro thread.
A otimizao do cdigo pode resultar em uma operao fora
de ordem.
Os threads operam em cpias de variveis compartilhadas
armazenadas no cache.
Para garantir o comportamento consistente nos threads,
voc deve sincronizar suas aes.
necessrio encontrar uma forma para declarar que uma
ao acontece antes de outra.
necessrio encontrar uma forma para descarregar
novamente, na memria principal, as alteraes feitas nas
variveis compartilhadas.
Sincronizando Aes
Cada thread tem uma memria de trabalho na qual mantm sua prpria cpia de trabalho
das variveis que deve usar ou designar. Como o thread executa um programa, ele opera
nessas cpias de trabalho. H vrias aes que sincronizaro a memria de trabalho de um
thread com a memria principal:
Uma leitura ou gravao voltil de uma varivel (a palavra-chave volatile)
O bloqueio ou desbloqueio de um monitor (a palavra-chave synchronized)
A primeira e ltima ao de um thread
Aes que iniciam um thread ou detectam que um thread foi encerrado
Programao Java SE 7 12 - 17
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Qual das alternativas a seguir representa a causa para um
thread sincronizar variveis?
a. A leitura de uma campo voltil
b. A chamada de isAlive() em um thread
c. A inicializao de um novo thread
d. A concluso de um bloco de cdigo sincronizado
Programao Java SE 7 12 - 18
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
A Palavra-chave volatile
Um campo pode ter o modificador volatile aplicado a ele:
public volatile int i;
A leitura ou gravao de um campo volatile far com
que um thread sincronize sua memria de trabalho com a
memria principal.
volatile no significa atmico.
Se i for volatile, i++ ainda no ser uma operao com
thread seguro.
Como a manipulao de campos volatile no pode ser atmica, no necessria
nenhuma outra ao que no seja a leitura e a gravao do thread seguro de variveis
nicas. Um bom exemplo de uso de volatile mostrado nos slides a seguir sobre como
parar um thread.
Programao Java SE 7 12 - 19
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Parando um Thread
Um thread pra depois que o respectivo mtodo run concludo.
public class ExampleRunnable implements Runnable {
public volatile boolean timeToQuit = false;
@Override
public void run() {
System.out.println("Thread started");
while(!timeToQuit) {
// ...
}
System.out.println("Thread finishing");
}
}
Varivel voltil
compartilhada
Programao Java SE 7 12 - 20
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Parando um Thread
public static void main (String[] args) {
ExampleRunnable r1 = new ExampleRunnable();
Thread t1 = new Thread(r1);
t1.start();
// ...
r1.timeToQuit = true;
}
O Thread Main
O mtodo main em uma aplicao Java SE executado em um thread, s vezes
denominado thread main, que criado automaticamente pela JVM. Assim como acontece
com qualquer thread, quando o thread main grava o campo timeToQuit, importante que a
gravao seja vista pelo thread t1. Se o campo timeToQuit no for volatile, no haver
garantia de que a gravao ser vista imediatamente. Observe que se voc esquecer de
declarar um campo similar como volatile, uma aplicao poder funcionar perfeitamente,
mas ocasionalmente no conseguir ser encerrada por outro usurio.
Programao Java SE 7 12 - 21
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
A Palavra-chave synchronized
A palavra-chave synchronized usada para criar blocos
de cdigo com thread seguro. Um bloco de cdigo
synchronized:
Faz com que um thread grave todas as suas alteraes
na memria principal quando o fim do bloco atingido
Similar a volatile
usado para agrupar blocos de cdigo para execuo
exclusiva
Os threads ficam bloqueados at que possam obter acesso
exclusivo
Resolve o problema atmico
Programao Java SE 7 12 - 22
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Mtodos synchronized
public class ShoppingCart {
private List<Item> cart = new ArrayList<>();
public synchronized void addItem(Item item) {
cart.add(item);
}
public synchronized void removeItem(int index) {
cart.remove(index);
}
public synchronized void printCart() {
Iterator<Item> ii = cart.iterator();
while(ii.hasNext()) {
Item i = ii.next();
System.out.println("Item:" + i.getDescription());
}
}
}
Comportamento do Mtodo Sincronizado
No exemplo do slide, voc pode chamar somente um mtodo por vez em um objeto
ShoppingCart porque todos os seus mtodos so synchronized. Neste exemplo,
a sincronizao feita por ShoppingCart. Duas instncias de ShoppingCart podem
ser usadas simultaneamente.
Se os mtodos no fossem synchronized, a chamada de removeItem enquanto
printCart est sendo iterado na coleo Item poderia resultar em um comportamento
imprevisvel. Um iteraror pode suportar o comportamento fail-fast. Um iterador fail-fast
lanar uma java.util.ConcurrentModificationException, uma subclasse de
RuntimeException, se a coleo do iterador for modificada enquanto estiver sendo usada.
Programao Java SE 7 12 - 23
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Blocos synchronized
public void printCart() {
StringBuilder sb = new StringBuilder();
synchronized (this) {
Iterator<Item> ii = cart.iterator();
while(ii.hasNext()) {
Item i = ii.next();
sb.append("Item:");
sb.append(i.getDescription());
sb.append("\n");
}
}
System.out.println(sb.toString());
}
Gargalos de Sincronizao
A sincronizao em aplicaes com vrios threads garante um comportamento confivel.
Como os blocos e mtodos synchronized so usados para restringir uma seo de cdigo
a um nico thread, voc possivelmente est criando gargalos de desempenho. Os blocos
synchronized podem ser usados no lugar dos mtodos synchronized para reduzir o
nmero de linhas exclusivas a um nico thread.
Use a sincronizao o mnimo possvel para fins de desempenho, mas o mximo necessrio
para garantir a confiabilidade.
Programao Java SE 7 12 - 24
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Bloqueio do Monitor de Objeto
Cada objeto na Java associado a um monitor, que um thread
pode bloquear ou desbloquear.
Os mtodos synchronized usam o monitor do objeto
this.
Os mtodos static synchronized usam o monitor das
classes.
Os blocos synchronized devem especificar qual monitor
do objeto ser bloqueado ou desbloqueado.
synchronized ( this ) { }
Os blocos synchronized podem ser aninhados.
Blocos synchronized Aninhados
Um thread pode bloquear vrios monitores simultaneamente usando blocos synchronized
aninhados.
Programao Java SE 7 12 - 25
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Detectando a Interrupo
A interrupo de um thread outra forma possvel de solicitar
a parada de um thread.
public class ExampleRunnable implements Runnable {
@Override
public void run() {
System.out.println("Thread started");
while(!Thread.interrupted()) {
// ...
}
System.out.println("Thread finishing");
}
}
Mtodo Thread esttico
A Interrupo No Significa uma Parada
Quando um thread interrompido, cabe a voc decidir qual medida ser tomada. Essa ao
pode ser retornar a partir do mtodo run ou continuar executando o cdigo.
Programao Java SE 7 12 - 26
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Interrompendo um Thread
Cada thread tem um mtodo interrupt() e isInterrupted().
public static void main(String[] args) {
ExampleRunnable r1 = new ExampleRunnable();
Thread t1 = new Thread(r1);
t1.start();
// ...
t1.interrupt();
}
Interromper um thread
Benefcios da Interrupo
O uso dos recursos de interrupo do Thread uma maneira conveniente de parar um
thread. Alm de eliminar a necessidade de voc gravar sua prpria lgica de parada de
thread, tambm ser possvel interromper um thread que esteja bloqueado. Para obter mais
informaes, consulte http://download.java.net/jdk7/docs/api/java/lang/Thread.html#interrupt().
Programao Java SE 7 12 - 27
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Thread.sleep()
Um Thread pode pausar a execuo durante um perodo.
long start = System.currentTimeMillis();
try {
Thread.sleep(4000);
} catch (InterruptedException ex) {
// What to do?
}
long time = System.currentTimeMillis() - start;
System.out.println("Slept for " + time + " ms");
interrupt() chamado durante a pausa
Por Quanto Tempo um Thread Ficar Pausado?
Uma solicitao de Thread.sleep(4000) significa que um thread quer parar a execuo
por 4 segundos. Aps esses 4 segundos, o thread agendado para execuo novamente.
Isso no significa que o thread ser iniciado exatamente 4 segundos aps a chamada para
sleep(), mas significa que o thread comear a ser executado 4 segundos ou mais aps a
pausa. A durao exata da pausa afetada pelo hardware da mquina, pelo sistema
operacional e pela carga do sistema.
Pausa Interrompida
Se voc chamar interrupt() em um thread pausado, a chamada para sleep() lanar
uma InterruptedException que deve ser tratada. O modo como voc deve tratar a
exceo depende de como a aplicao foi projetada. Se chamar interrupt() significa
apenas interromper a chamada para sleep(), e no a execuo de um thread, voc pode
englobar a exceo. Outros casos podem exigir o relanamento da exceo ou o retorno a
partir de um mtodo run().
Programao Java SE 7 12 - 28
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Uma chamada para Thread.sleep(4000) far com que
o thread em execuo sempre pause por exatamente 4 segundos
a. Verdadeiro
b. Falso
Programao Java SE 7 12 - 29
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Mtodos Thread Adicionais
H muito mais Thread e mtodos relacionados a threading:
setName(String), getName() e getId()
isAlive(): Um thread foi encerrado?
isDaemon() e setDaemon(boolean): A JVM pode ser
encerrada enquanto os threads daemon esto em execuo.
join(): Um thread atual aguarda que outro thread seja
encerrado.
Thread.currentThread(): As instncias de Runnable
podem recuperar a instncia de Thread em execuo no
momento.
A classe Object tambm tem mtodos relacionados a
threading:
wait(), notify() e notifyAll(): Os threads podem ficar
em pausa por um perodo indeterminado, sendo reativados
somente quando o Object que eles aguardavam receber uma
notificao de ativao.
Aprendendo Mais
Os threads daemon so threads em segundo plano menos importantes do que os threads
normais. Como o thread principal no um thread daemon, todos os threads criados tambm
sero threads no daemon. Qualquer thread no daemon que ainda est em execuo
(ativo) impedir que a JVM seja encerrada, mesmo se o mtodo main for retornado. Se um
thread no tiver que impedir o encerramento da JVM, ele dever ser definido como um thread
daemon. H mais conceitos e mtodos de multithreading que podem ser assimilados. Para
obter um material de leitura adicional, consulte
http://download.oracle.com/javase/tutorial/essential/concurrency/further.html.
Programao Java SE 7 12 - 30
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Mtodos a Serem Evitados
Alguns mtodos Thread devem ser evitados:
setPriority(int) e getPriority()
Pode no ter nenhum impacto ou pode causar problemas
Os mtodos a seguir esto depreciados e nunca devem
ser usados:
destroy()
resume()
suspend()
stop()
Depreciao
As classes, as interfaces, os mtodos, as variveis e outros componentes de qualquer
biblioteca Java podem ser marcados como depreciados. Os componentes depreciados
podem ocasionar um comportamento imprevisvel ou simplesmente no terem obedecido s
convenes de nomenclatura adequadas. Evite o uso de qualquer API depreciada nas
aplicaes. As APIs depreciadas ainda esto includas nas bibliotecas para garantir a
compatibilidade com verses anteriores, mas possivelmente sero removidas nas verses
futuras da Java.
Para obter mais informaes sobre a causa da depreciao dos mtodos mencionados
anteriormente, consulte docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html,
est disponvel on-line em http://download.oracle.com/javase/7/ ou como parte da
documentao para download do JDK.
Programao Java SE 7 12 - 31
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Deadlock
O deadlock acontece quando dois ou mais threads ficam
bloqueados para sempre, um esperando pelo outro.
synchronized(obj1) {
synchronized(obj2) {
}
}
synchronized(obj2) {
synchronized(obj1) {
}
}
O thread 1 pausa aps o bloqueio
do monitor de obj1.
O thread 2 pausa aps o bloqueio
do monitor de obj2.
Apesar de menos comuns que os deadlocks, starvation e livelock so problemas que todo
designer de software concorrente provavelmente encontrar.
Starvation
A starvation representa uma situao em que um thread no consegue obter acesso regular
a recursos compartilhados e fica impossibilitado de avanar. Isso acontece quando os
recursos compartilhados so indisponibilizados durante longos perodos por threads
vorazes. Por exemplo, suponhamos que um objeto fornea um mtodo sincronizado que
geralmente demore muito para ser retornado. Se um thread chamar esse mtodo
frequentemente, outros threads que tambm precisam de acesso sincronizado regular ao
mesmo objeto sero bloqueados com frequncia.
Livelock
Um thread geralmente age em resposta ao de outro thread. Se a ao do outro thread
tambm for uma resposta ao de outro thread, o resultado poder ser um livelock. Assim
como acontece com o deadlock, os threads com livelock ficam incapacitados de avanar. No
entanto, os threads no esto bloqueados; eles esto simplesmente muito ocupados para
responder uns aos outros e, assim, retomar o trabalho.
Programao Java SE 7 12 - 32
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Resumo
Nesta lio, voc aprendeu a:
Descrever o agendamento de tarefas do sistema
operacional
Definir um thread
Criar threads
Gerenciar threads
Sincronizar threads acessando dados compartilhados
Identificar problemas de threading potenciais
Programao Java SE 7 12 - 33
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exerccio 12-1 - Viso Geral:
Sincronizando o Acesso a Dados Compartilhados
Este exerccio aborda os seguintes tpicos:
Impresso de IDs de threads
Uso de Thread.sleep()
Sincronizao de um bloco de cdigo
Neste exerccio, voc gravar uma classe que foi adicionada a uma aplicao com vrios
threads. Voc dever atribuir classe um thread seguro.
Programao Java SE 7 12 - 34
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exerccio 12-2 - Viso Geral:
Implementando um Programa com Vrios Threads
Este exerccio aborda os seguintes tpicos:
Implementao de Runnable
Inicializao de um Thread
Verificao do status de um Thread
Interrupo de um Thread
Neste exerccio, voc criar, iniciar e interromper threads bsicos usando a interface
Runnable.
Programao Java SE 7 12 - 35
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Concorrncia
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Objetivos
Aps concluir esta lio, voc ser capaz de:
Usar variveis atmicas
Usar um ReentrantReadWriteLock
Usar as colees java.util.concurrent
Descrever as classes do sincronizador
Usar um ExecutorService para executar tarefas de
modo concorrente
Aplicar o framework Fork-Join
Programao Java SE 7 13 - 2
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
O Pacote java.util.concurrent
A Java 5 incorporou o pacote java.util.concurrent,
que contm classes teis na programao concorrente.
Os recursos incluem:
Colees concorrentes
Alternativas de sincronizao e bloqueio
Pools de threads
Pools de contagem de threads fixos e dinmicos disponveis
Diviso e conquista (divide and conque) paralelas (Fork-
Join) - novo na Java 7
Programao Java SE 7 13 - 3
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
O Pacote java.util.concurrent.atomic
O pacote java.util.concurrent.atomic contm classes
que suportam a programao de thread seguro livre de
bloqueio em variveis nicas
AtomicInteger ai = new AtomicInteger(5);
if(ai.compareAndSet(5, 42)) {
System.out.println("Replaced 5 with 42");
}
Uma operao atmica garante
que o valor atual ser 5 e, em
seguida, o definir para 42.
Operao sem Bloqueio
Nas arquiteturas de CPU que suportam operao de comparao e definio nativa, no
haver necessidade de bloqueio durante a execuo do exemplo mostrado. Outras
arquiteturas podem exigir alguma forma de bloqueio interno.
Programao Java SE 7 13 - 4
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
O Pacote java.util.concurrent.locks
O pacote java.util.concurrent.locks um framework
para bloquear e aguardar condies distintas da sincronizao
interna e dos monitores.
public class ShoppingCart {
private final ReentrantReadWriteLock rwl =
new ReentrantReadWriteLock();
public void addItem(Object o) {
rwl.writeLock().lock();
// modify shopping cart
rwl.writeLock().unlock();
}
Um bloqueio com
gravador nico e
vrios leitores
Bloqueio de
Gravao
Bloqueio com Vrios Leitores e Gravador nico
Um dos recursos do pacote java.util.concurrent.locks a implementao de um
bloqueio com vrios leitores e gravador nico. Um thread pode no ter ou obter um bloqueio
de leitura enquanto um bloqueio de gravao est em uso. Vrios threads podem adquirir o
bloqueio de leitura de modo concorrente, mas somente um thread pode adquirir o bloqueio
de gravao. O bloqueio reentrante; um thread que j adquiriu o bloqueio de gravao
pode chamar mtodos adicionais que tambm obtm o bloqueio de gravao sem receio do
bloqueio.
Programao Java SE 7 13 - 5
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
java.util.concurrent.locks
public String getSummary() {
String s = "";
rwl.readLock().lock();
// read cart, modify s
rwl.readLock().unlock();
return s;
}
public double getTotal() {
// another read-only method
}
}
Todos os mtodos somente para
leitura podem ser executados de
modo concorrente.
Bloqueio de
Leitura
Vrias Leituras Concorrentes
No exemplo, todos os mtodos determinados para ser somente para leitura podem adicionar
o cdigo necessrio para bloquear e desbloquear um bloqueio de leitura. Um
ReentrantReadWriteLock permite a execuo concorrente de um nico mtodo somente
para leitura e de vrios mtodos somente para leitura.
Programao Java SE 7 13 - 6
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Colees de Thread Seguro
As colees java.util no tm thread seguro. Para usar
colees de acordo com um thread seguro:
Use bloqueios de cdigo sincronizados em todos os
acessos a uma coleo se forem executadas gravaes
Crie um encapsulador sincronizado usando mtodos de
biblioteca, como
java.util.Collections.synchronizedList(List<T>)
Use as colees java.util.concurrent
Observao: No porque uma Collection tem thread
seguro que seus elementos tambm tero thread seguro.
Colees Concorrentes
A classe ConcurrentLinkedQueue fornece uma fila FIFO sem bloqueio, com thread
seguro, escalonvel e eficiente. Cinco implementaes em java.util.concurrent
suportam a interface BlockingQueue estendida, que define verses de bloqueio de
mtodos put and take: LinkedBlockingQueue, ArrayBlockingQueue,
SynchronousQueue, PriorityBlockingQueue e DelayQueue.
Alm das filas, esse pacote fornece Collection implementaes projetadas para uso em
contextos de vrios threads: ConcurrentHashMap, ConcurrentSkipListMap,
ConcurrentSkipListSet, CopyOnWriteArrayList e CopyOnWriteArraySet.
Quando espera-se que muitos threads acessem uma coleo especfica, um
ConcurrentHashMap normalmente prefervel a um HashMap sincronizado e um
ConcurrentSkipListMap normalmente prefervel a um TreeMap sincronizado. Uma
CopyOnWriteArrayList ser prefervel a uma ArrayList sincronizada quando o nmero
esperado de leituras e travessias ultrapassar consideravelmente o nmero de atualizaes
em uma lista.
Programao Java SE 7 13 - 7
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Uma CopyOnWriteArrayList garante a segurana do
thread de qualquer objeto adicionado List.
a. Verdadeiro
b. Falso
Programao Java SE 7 13 - 8
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Sincronizadores
O pacote java.util.concurrent fornece cinco classes que
auxiliam idiomas de sincronizao comuns para fins especiais.
Classe Descrio
Semaphore Semaphore uma ferramenta de concorrncia clssica.
CountDownLatch Um utilitrio muito simples e comum para o bloqueio at um
nmero especfico de sinais, eventos ou condies retidos
CyclicBarrier Um ponto de sincronizao multidirecional redefinvel, til em
alguns estilos de programao paralela
Phaser Fornece uma forma de barreira mais flexvel que pode ser usada
para controlar a computao em fase entre vrios threads
Exchanger Permite que dois threads troquem objetos em um ponto de
encontro; til em vrios designs de pipeline
As classes de sincronizador permitem que os threads sejam bloqueados at que um estado
ou ao especfico seja atingido.
Semaphore: A classe Semaphore mantm um conjunto de permisses. Os threads tentam
adquirir permisses e podem permanecer bloqueados at que outros threads liberem
permisses.
CountDownLatch: A classe CountDownLatch permite que um ou mais threads aguardem
(sejam bloqueados) at o trmino de uma contagem regressiva. Depois que a contagem
regressiva for concluda, todos os threads que esto aguardando continuaro. A classe
CountDownLatch no pode ser reutilizada.
CyclicBarrier: Criada com uma contagem de parte. Depois que o nmero de partes
(threads) tiver chamado await na CyclicBarrier, eles sero liberados (desbloqueados). A
classe CyclicBarrier no pode ser reutilizada.
Phaser: Uma verso mais verstil de CyclicBarrier nova na Java 7. As partes podem
registrar e cancelar o registro ao longo do tempo, fazendo com que o nmero de threads
necessrios antes do avano seja alterado.
Exchanger: Permite que dois threads faa o swap de um par de objetos, permanecendo
bloqueados at que uma troca seja efetuada. Ela uma alternativa bidirecional para uma
SynchronousQueue, com memria eficiente.
Programao Java SE 7 13 - 9
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
java.util.concurrent.CyclicBarrier
A CyclicBarrier um exemplo da categoria de sincronizador
das classes fornecidas por java.util.concurrent.
final CyclicBarrier barrier = new CyclicBarrier(2);
new Thread() {
public void run() {
try {
System.out.println("before await - thread 1");
barrier.await();
System.out.println("after await - thread 1");
} catch (BrokenBarrierException|InterruptedException ex) {
}
}
}.start();
Dois threads devem aguardar para
que possam ser desbloqueados.
No pode ser
acessado
Comportamento de CyclicBarrier
Neste exemplo, se apenas um thread chamar await() na barreira, esse thread
possivelmente ficar bloqueado para sempre. Depois que um segundo thread chamar
await(), qualquer chamada adicional para await() ficar bloqueada novamente at que o
nmero necessrio de threads seja atingido. A classe CyclicBarrier contm um mtodo,
await(long timeout, TimeUnit unit), que ficar bloqueado por um perodo
especificado e lanar uma TimeoutException se esse perodo for atingido.
Programao Java SE 7 13 - 10
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Alternativas de Threading de Alto Nvel
O uso correto das APIs tradicionais relacionadas a Thread
pode ser difcil. Estas so as alternativas:
java.util.concurrent.ExecutorService, um
mecanismo de nvel superior usado para executar tarefas
Pode criar e reutilizar objetos Thread para voc.
Permite que voc envie trabalho e verifique os resultados no
futuro.
O framework Fork-Join, um ExecutorService de roubo
de trabalho (work-stealing) especializado novo na Java 7
Alternativas de Sincronizao
Os blocos de cdigo sincronizados so usados para garantir que os dados que no tm
threads seguros no sejam acessados de modo concorrente por vrios threads. No entanto,
o uso de blocos de cdigo sincronizados pode resultar em gargalos de desempenho. Vrios
componentes do pacote java.util.concurrent fornecem alternativas para o uso de
blocos de cdigo sincronizados. Alm do aproveitamento das colees concorrentes, filas e
sincronizadores, h outra forma de garantir que os dados no sero acessados
incorretamente por vrios threads: Simplesmente no permita que vrios threads processem
os mesmos dados. Em alguns cenrios, talvez seja possvel criar vrias cpias dos dados na
RAM e permitir que cada thread processe uma cpia exclusiva.
Programao Java SE 7 13 - 11
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
java.util.concurrent.ExecutorService
Um ExecutorService usado para executar tarefas.
Ele elimina a necessidade de criar e gerenciar os threads
manualmente.
As tarefas podem ser executadas paralelamente,
dependendo da implementao de ExecutorService.
As tarefas podem ser:
java.lang.Runnable
java.util.concurrent.Callable
A implementao das instncias pode ser obtida com
Executors.
ExecutorService es = Executors.newCachedThreadPool();
O Comportamento de um ExecutorService
ExecutorService, um pool de threads armazenado no cache:
Cria novos threads quando necessrio
Reutiliza seus threads (os threads no so exterminados depois que a respectiva tarefa
finalizada.)
Encerra os threads que ficaram ociosos por 60 segundos
Outros tipos de implementaes de ExecutorService esto disponveis:
int cpuCount = Runtime.getRuntime().availableProcessors();
ExecutorService es = Executors.newFixedThreadPool(cpuCount);
Um pool de threads fixo ExecutorService:
Contm um nmero fixo de threads
Reutiliza seus threads (os threads no so exterminados depois que a respectiva tarefa
finalizada.)
Enfileira o trabalho at que um thread seja disponibilizado
Pode ser usado para evitar a sobrecarga de um sistema com tarefas que exigem muito
da CPU
Programao Java SE 7 13 - 12
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
java.util.concurrent.Callable
A interface Callable:
Define uma tarefa enviada a um ExecutorService
similar em natureza a Runnable, mas pode:
Retornar um resultado usando genricos
Lanar uma exceo verificada
package java.util.concurrent;
public interface Callable<V> {
V call() throws Exception;
}
Programao Java SE 7 13 - 13
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
java.util.concurrent.Future
A interface Future usada para obter os resultados do
mtodo V call() de um Callable.
Future<V> future = es.submit(callable);
//submit many callables
try {
V result = future.get();
} catch (ExecutionException|InterruptedException ex) {
}
Obter o resultado do mtodo call de
Callable (bloquear se necessrio).
ExecutorService controla
quando o trabalho feito.
Se Callable tiver lanado
uma Exception
Aguardando Future
Como a chamada para Future.get() ser bloqueada, voc dever fazer o seguinte:
Envie todo o trabalho ao ExecutorService antes de chamar qualquer mtodo
Future.get().
Esteja preparado para aguardar esse Future a fim de obter o resultado.
Use um mtodo sem bloqueio como Future.isDone() antes de chamar
Future.get() ou usar Future.get(long timeout, TimeUnit unit), o que
lanar uma TimeoutException se o resultado no estiver disponvel dentro de um
perodo especificado.
Programao Java SE 7 13 - 14
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Desligando um ExecutorService
O desligamento de um ExecutorService importante
porque seus threads no so relacionados a daemon e
impedir o desligamento da JVM.
es.shutdown();
try {
es.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException ex) {
System.out.println("Stopped waiting early");
}
Se voc optar por aguardar a
finalizao dos Callables
No aceitar mais
novos Callables.
Programao Java SE 7 13 - 15
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Um ExecutorService sempre tentar usar todas as CPUs
disponveis em um sistema.
a. Verdadeiro
b. Falso
Programao Java SE 7 13 - 16
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
E/S Concorrente
As chamadas de bloqueio sequenciais so executadas por um
perodo mais longo do que as chamadas de bloqueio concorrentes.
Relgio de Parede
H diferentes maneiras de medir o tempo. No grfico, uma sequncia de cinco chamadas
para o servidores de rede levar aproximadamente 10 segundos se cada chamada durar 2
segundos. No lado direito do grfico, cinco chamadas concorrentes para servidores de rede
possivelmente levar pouco mais de 2 segundos se cada chamada durar 2 segundos. Os
dois exemplos usam aproximadamente a mesma quantidade de tempo da CPU, a quantidade
de ciclos de CPU consumidos, mas tm duraes gerais diferentes ou a hora do relgio de
parede.
Programao Java SE 7 13 - 17
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Um Cliente de Rede com Thread nico
public class SingleThreadClientMain {
public static void main(String[] args) {
String host = "localhost";
for (int port = 10000; port < 10010; port++) {
RequestResponse lookup =
new RequestResponse(host, port);
try (Socket sock = new Socket(lookup.host, lookup.port);
Scanner scanner = new Scanner(sock.getInputStream());){
lookup.response = scanner.next();
System.out.println(lookup.host + ":" + lookup.port + " " +
lookup.response);
} catch (NoSuchElementException|IOException ex) {
System.out.println("Error talking to " + host + ":" +
port);
}
}
}
}
Chamada Sncrona
No exemplo deste slide, estamos tentando descobrir qual fornecedor oferece o preo mais
baixo para um item. O cliente se comunicar com dez servidores de rede diferentes; cada
servidor levar aproximadamente dois segundos para analisar os dados solicitados e retorn-
los. Talvez haja atrasos adicionais inseridos pela latncia da rede.
Esse cliente de thread nico deve aguardar cada servidor responder antes de passar para
outro servidor. Cerca de 20 segundos so necessrios para recuperar todos os dados.
Programao Java SE 7 13 - 18
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Um Cliente de Rede com Vrios Threads (Parte 1)
public class MultiThreadedClientMain {
public static void main(String[] args) {
//ThreadPool used to execute Callables
ExecutorService es = Executors.newCachedThreadPool();
//A Map used to connect the request data with the result
Map<RequestResponse,Future<RequestResponse>> callables =
new HashMap<>();
String host = "localhost";
//loop to create and submit a bunch of Callable instances
for (int port = 10000; port < 10010; port++) {
RequestResponse lookup = new RequestResponse(host, port);
NetworkClientCallable callable =
new NetworkClientCallable(lookup);
Future<RequestResponse> future = es.submit(callable);
callables.put(lookup, future);
}
Chamada Assncrona
No exemplo deste slide, estamos tentando descobrir qual fornecedor oferece o preo mais
baixo para um item. O cliente se comunicar com dez servidores de rede diferentes; cada
servidor levar aproximadamente dois segundos para analisar os dados solicitados e retorn-
los. Talvez haja atrasos adicionais inseridos pela latncia da rede.
Esse cliente com vrios threads no espera cada servidor responder antes de tentar se
comunicar com outro servidor. Cerca de 2 segundos, em vez de 20, so necessrios para
recuperar todos os dados.
Programao Java SE 7 13 - 19
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Um Cliente de Rede com Vrios Threads (Parte 2)
//Stop accepting new Callables
es.shutdown();
try {
//Block until all Callables have a chance to finish
es.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException ex) {
System.out.println("Stopped waiting early");
}
Programao Java SE 7 13 - 20
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Um Cliente de Rede com Vrios Threads (Parte 3)
for(RequestResponse lookup : callables.keySet()) {
Future<RequestResponse> future = callables.get(lookup);
try {
lookup = future.get();
System.out.println(lookup.host + ":" + lookup.port + " " +
lookup.response);
} catch (ExecutionException|InterruptedException ex) {
//This is why the callables Map exists
//future.get() fails if the task failed
System.out.println("Error talking to " + lookup.host +
":" + lookup.port);
}
}
}
}
Programao Java SE 7 13 - 21
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Um Cliente de Rede com Vrios Threads (Parte 4)
public class RequestResponse {
public String host; //request
public int port; //request
public String response; //response
public RequestResponse(String host, int port) {
this.host = host;
this.port = port;
}
// equals and hashCode
}
Programao Java SE 7 13 - 22
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Um Cliente de Rede com Vrios Threads (Parte 5)
public class NetworkClientCallable implements Callable<RequestResponse> {
private RequestResponse lookup;
public NetworkClientCallable(RequestResponse lookup) {
this.lookup = lookup;
}
@Override
public RequestResponse call() throws IOException {
try (Socket sock = new Socket(lookup.host, lookup.port);
Scanner scanner = new Scanner(sock.getInputStream());) {
lookup.response = scanner.next();
return lookup;
}
}
}
Programao Java SE 7 13 - 23
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Paralelismo
Os sistemas modernos contm vrias CPUs. Para tirar proveito
da capacidade de processamento de um sistema, necessrio
que voc execute tarefas paralelamente em vrias CPUs.
Diviso e conquista: Uma tarefa deve ser dividida em
subtarefas. Voc deve tentar identificar essas subtarefas
que podem ser executadas paralelamente.
Alguns problemas podem ser difceis de serem
executados como tarefas paralelas.
Alguns problemas so mais fceis. Os servidores que
suportam vrios clientes podem usar uma tarefa separada
para tratar cada cliente.
Conhea o seu hardware. O agendamento de muitas
tarefas paralelas pode impactar o desempenho
negativamente.
Contagem de CPUs
Se as tarefas usarem muito os recursos do computador em vez da E/S, o nmero de tarefas
paralelas no dever ultrapassar muito o nmero de processadores do sistema. possvel
detectar facilmente o nmero de processadores na Java:
int count = Runtime.getRuntime().availableProcessors();
Programao Java SE 7 13 - 24
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Sem Paralelismo
Os sistemas modernos contm vrias CPUs. Se voc no
aproveitar os threads de alguma forma, somente uma parte
da capacidade de processamento do sistema ser utilizada.
Definindo o Estgio
Se voc tiver um grande volume de dados a ser processado, mas somente um thread para
process-los, uma nica CPU ser usada. No grfico do slide, um grande conjunto de dados
(um array, possivelmente) ser processado. O processamento de arrays poderia ser uma
tarefa simples, como localizar o valor mais alto no array. Em um sistema com quatro CPUs,
trs CPUs ficariam ociosas durante o processamento do array.
Programao Java SE 7 13 - 25
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Paralelismo Ingnuo
Uma soluo de paralelismo simples fragmenta os dados
a serem processados em vrios conjuntos. Um conjunto
de dados para cada CPU e um thread para processar cada
conjunto de dados.
Dividindo os Dados
No grfico do slide, um grande conjunto de dados (um array, possivelmente) dividido em
quatro subconjuntos de dados, um subconjunto para cada CPU. Um thread por CPU criado
para processar os dados. Aps o processamento, os subconjuntos de dados precisaro ser
combinados de uma forma explicativa. H vrias maneiras de subdividir o grande conjunto de
dados que ser processado. Seria sobrecarregar demais a memria criar um novo array por
thread que contenha a cpia de uma parte do array original. Cada array pode compartilhar
uma referncia ao nico array grande, mas acessar somente um subconjunto de acordo com
o thread seguro sem bloqueio.
Programao Java SE 7 13 - 26
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
A Necessidade do Framework Fork-Join
A diviso dos conjuntos de dados em subconjuntos de tamanho
igual que sero processados por cada thread resultar em
vrios problemas. O ideal que todas as CPUs sejam
completamente utilizadas at que a tarefa seja finalizada, mas:
As CPUs podem ser executadas em velocidades diferentes
As tarefas no Java precisam do tempo da CPU e podem
reduzir o tempo disponibilizado para um thread Java utilizar
na execuo de uma CPU
Os dados que esto
sendo analisados podem
exigir perodos de tempo
variveis para serem
processados
Programao Java SE 7 13 - 27
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Roubo de Trabalho
Para manter vrios threads ocupados:
Divida os dados a serem processados em um grande
nmero de subconjuntos
Designe os subconjuntos de dados fila de processamento
de um thread
Cada thread ter muitos subconjuntos
enfileirados
Se um thread finalizar todos os seus
subconjuntos com antecedncia,
ele poder roubar subconjuntos
deoutro thread.
Granularidade do Trabalho
Subdividindo os dados a serem processados at que haja mais subconjuntos do que threads,
estamos facilitando o roubo de trabalho. No roubo de trabalho, um thread que fica sem
trabalho pode roubar trabalho (um subconjunto de dados) da fila de processamento de outro
thread. Voc deve determinar o tamanho ideal do trabalho a ser adicionado fila de
processamento de cada thread. A subdiviso excessiva dos dados a serem processados
pode ocasionar uma sobrecarga desnecessria, e a subdiviso insuficiente dos dados pode
resultar no baixo uso das CPUs.
Programao Java SE 7 13 - 28
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Um Exemplo de Thread nico
int[] data = new int[1024 * 1024 * 256]; //1G
for (int i = 0; i < data.length; i++) {
data[i] = ThreadLocalRandom.current().nextInt();
}
int max = Integer.MIN_VALUE;
for (int value : data) {
if (value > max) {
max = value;
}
}
System.out.println("Max value found:" + max);
Um conjunto de
dados muito grande
Preencha o array com valores.
Pesquise sequencialmente o
array em busca do valor maior.
Potencial Paralelo
Neste exemplo, h duas tarefas separadas que podem ser executadas paralelamente. A
inicializao do array com valores aleatrios e a pesquisa do array em busca do maior valor
possvel podem ser feitas paralelamente.
Programao Java SE 7 13 - 29
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
java.util.concurrent.ForkJoinTask<V>
Um objeto ForkJoinTask representa uma tarefa a ser
executada.
Uma tarefa que contm o cdigo e os dados a serem
processados. Similar a Runnable ou Callable.
Um grande nmero de tarefas criado e processado por
um pequeno nmero de threads em um pool Fork-Join.
Uma ForkJoinTask geralmente cria mais instncias de
ForkJoinTask at que os dados a serem processados
sejam subdivididos adequadamente.
Os desenvolvedores geralmente usam as seguintes
subclasses:
RecursiveAction: Quando uma tarefa no precisa
retornar um resultado
RecursiveTask: Quando uma tarefa precisa retornar um
resultado
Programao Java SE 7 13 - 30
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exemplo de RecursiveTask
public class FindMaxTask extends RecursiveTask<Integer> {
private final int threshold;
private final int[] myArray;
private int start;
private int end;
public FindMaxTask(int[] myArray, int start, int end,
int threshold) {
// copy parameters to fields
}
protected Integer compute() {
// shown later
}
}
Tipo de resultado da tarefa
Os dados a serem processados
O local em que o trabalho
feito. Observe o tipo de
retorno genrico.
Programao Java SE 7 13 - 31
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Estrutura compute
protected Integer compute() {
if DATA_SMALL_ENOUGH {
PROCESS_DATA
return RESULT;
} else {
SPLIT_DATA_INTO_LEFT_AND_RIGHT_PARTS
TASK t1 = new TASK(LEFT_DATA);
t1.fork();
TASK t2 = new TASK(RIGHT_DATA);
return COMBINE(t2.compute(), t1.join());
}
}
Bloqueio at que
seja concludo
Execuo assncrona
Processo no thread atual
Programao Java SE 7 13 - 32
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exemplo de compute (Abaixo do Limite)
protected Integer compute() {
if (end - start < threshold) {
int max = Integer.MIN_VALUE;
for (int i = start; i <= end; i++) {
int n = myArray[i];
if (n > max) {
max = n;
}
}
return max;
} else {
// split data and create tasks
}
}
Voc decide o limite.
A faixa dentro do
array
Programao Java SE 7 13 - 33
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exemplo de compute (Acima do Limite)
protected Integer compute() {
if (end - start < threshold) {
// find max
} else {
int midway = (end - start) / 2 + start;
FindMaxTask a1 =
new FindMaxTask(myArray, start, midway, threshold);
a1.fork();
FindMaxTask a2 =
new FindMaxTask(myArray, midway + 1, end, threshold);
return Math.max(a2.compute(), a1.join());
}
}
Tarefa da metade
esquerda dos dados
Tarefa da metade direita dos dados
Gerenciamento de Memria
Observe que o mesmo array passado para cada tarefa, mas com diferentes valores iniciais
e finais. Se o subconjunto de valores a ser processado fosse copiado em um novo array cada
vez que uma tarefa fosse criada, o uso da memria aumentaria rapidamente.
Programao Java SE 7 13 - 34
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exemplo de ForkJoinPool
Um ForkJoinPool usado para executar um
ForkJoinTask. Ele cria um thread para cada CPU no
sistema, por padro.
ForkJoinPool pool = new ForkJoinPool();
FindMaxTask task =
new FindMaxTask(data, 0, data.length-1, data.length/16);
Integer result = pool.invoke(task);
O mtodo compute da tarefa
chamado automaticamente.
Programao Java SE 7 13 - 35
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Recomendaes do Framework Fork-Join
Evite operaes de E/S ou bloqueio.
Somente um thread por CPU criado, por padro. As operaes
de bloqueio impediriam voc de utilizar todos os recursos da
CPU.
Conhea seu hardware.
Uma soluo Fork-Join ser executada com mais lentido em um
sistema de CPU nica do que em uma soluo sequencial
padro.
Algumas CPUs apresentam uma velocidade maior quando usam
somente um ncleo, possivelmente compensando qualquer
ganho de desempenho fornecido pelo Fork-Join.
Conhea seu problema.
Muitos problemas tero sobrecarga adicional se forem
executados paralelamente (classificao paralela, por exemplo).
Classificao Paralela
Ao usar Fork-Join para classificar um array paralelamente, voc acabar classificando vrios
arrays pequenos e precisando combinar os arrays pequenos classificados em arrays grandes
classificados. Para obter um exemplo, consulte a aplicao de amostra fornecida com o JDK
em C:\Program Files\Java\jdk1.7.0\sample\forkjoin\mergesort.
Programao Java SE 7 13 - 36
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
A aplicao do framework Fork-Join sempre resultar em um
benefcio de desempenho.
a. Verdadeiro
b. Falso
Programao Java SE 7 13 - 37
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Resumo
Nesta lio, voc aprendeu a:
Usar variveis atmicas
Usar um ReentrantReadWriteLock
Usar as colees java.util.concurrent
Descrever as classes do sincronizador
Usar um ExecutorService para executar tarefas
de modo concorrente
Aplicar o framework Fork-Join
Programao Java SE 7 13 - 38
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
(Opcional) Exerccio 13-1 - Viso Geral:
Usando o Pacote java.util.concurrent
Este exerccio aborda os seguintes tpicos:
Uso de um pool de threads armazenado no cache
(ExecutorService)
Implementao de Callable
Recebimento dos resultados de Callable com um
Future
Neste exerccio, voc criar um cliente de rede com vrios threads.
Programao Java SE 7 13 - 39
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
(Opcional) Exerccio 13-2 - Viso Geral:
Usando o Framework Fork-Join
Este exerccio aborda os seguintes tpicos:
Estendendo o RecursiveAction
Criando e usando um ForkJoinPool
Neste exerccio, voc criar um cliente de rede com vrios threads.
Programao Java SE 7 13 - 40
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Criando Aplicaes de Banco de Dados com JDBC
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Objetivos
Aps concluir esta lio, voc ser capaz de:
Definir o layout da API JDBC
Conectar-se a um banco de dados usado um driver JDBC
Enviar consultas e obter resultados do banco de dados
Especificar informaes do driver JDBC externamente
Usar transaes com JDBC
Usar o RowSetProvider e RowSetFactory do JDBC 4.1
Usar um Padro do Objeto de Acesso a Dados para separar
dados e mtodos de negcio
Programao Java SE 7 14 - 2
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Usando a API JDBC
1
2
3
A API JDBC composta por algumas classes concretas, como Date, Time e
SQLException, e um conjunto de interfaces implementadas em uma classe de driver
fornecida pelo fornecedor de banco de dados.
Como a implementao uma instncia vlida da assinatura de mtodo da interface, depois
que as classes Driver do fornecedor de banco de dados so carregadas, possvel acess-
las seguindo a sequncia mostrada no slide:
1. Use a classe DriverManager para obter uma referncia a um objeto Connection
usando o mtodo getConnection. A assinatura comum desse mtodo
getConnection (url, name, password), em que url o URL do JDBC, e name
e password so strings que o banco de dados aceitar em uma conexo.
2. Use o objeto Connection (implementado por alguma classe fornecida pelo
fornecedor) para obter uma referncia a um objeto Statement por meio do mtodo
createStatement. A assinatura comum desse mtodo createStatement ()
sem argumentos.
3. Use o objeto Statement para obter uma instncia de ResultSet por meio de um
mtodo executeQuery (query). Esse mtodo geralmente aceita uma string
(query), em que query uma SQL de string esttica.
Programao Java SE 7 14 - 3
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Usando a Classe Driver de um Fornecedor
A classe DriverManager usada para obter uma instncia
de um objeto Connection, usando o driver JDBC nomeado no
URL do JDBC:
String url = "jdbc:derby://localhost:1527/EmployeeDB";
Connection con = DriverManager.getConnection (url);
A sintaxe do URL para um driver JDBC :
jdbc:<driver>:[subsubprotocol:][databaseName][;attribute=value]
Cada fornecedor pode implementar seu prprio
subprotocolo.
A sintaxe do URL de um driver Thin da Oracle :
jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE
Exemplo:
jdbc:oracle:thin:@//myhost:1521/orcl
DriverManager
Qualquer driver JDBC 4.0 encontrado no caminho da classe carregado automaticamente. O
mtodo DriverManager.getConnection tentar carregar a classe do driver analisando o
arquivo META_INF/services/java.sql.Driver. Esse arquivo contm o nome da
implementao do driver JDBC de java.sql.Driver. Por exemplo, o contedo de META-
INF/services/java.sql.driver no derbyclient.jar contm
org.apache.derby.jdbc.ClientDriver.
As unidades anteriores a JDBC 4.0 devem ser carregadas manualmente usando:
try {
java.lang.Class.forName("<fully qualified path of the driver>");
} catch (ClassNotfoundException c) {
}
As classes de driver tambm podem ser passadas para o interpretador na linha de comando:
java djdbc.drivers=<fully qualified path to the driver> <class to
run>
Programao Java SE 7 14 - 4
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Principais Componentes da API JDBC
A classe de driver JDBC de cada fornecedor tambm
implementa as principais classes de API que voc usar para
se conectar ao banco de dados, executar consultas e
manipular dados:
java.sql.Connection: Uma conexo que representa
a sesso entre a aplicao Java e o banco de dados
Connection con = DriverManager.getConnection(url,
username, password);
java.sql.Statement: Um objeto usado para executar
uma instruo SQL esttica e retornar o resultado
Statement stmt = con.createStatement ();
java.sql.ResultSet: Um objeto que representa um
conjunto de resultados do banco de dados
String query = "SELECT * FROM Employee";
ResultSet rs = stmt.executeQuery(query);
Conexes, Instrues e ResultSets.
A real vantagem da API JDBC que ela oferece uma forma flexvel e porttil de se comunicar
com um banco de dados.
O driver JDBC oferecido por um fornecedor de banco de dados implementa cada uma dessas
interfaces Java. O cdigo Java pode usar a interface sabendo que o fornecedor do banco de
dados ofereceu a implementao de cada um dos mtodos na interface.
Connection uma interface que fornece uma sesso com o banco de dados. Enquanto o
objeto de conexo estiver aberto, voc poder acessar o banco de dados, criar instrues, obter
resultados e manipular o banco de dados. Quando voc fechar uma conexo, o acesso ao banco
de dados ser encerrado e a conexo aberta ser fechada.
Statement uma interface que fornece uma classe para a execuo das instrues SQL e o
retorno dos resultados. A interface Statement destina-se a consultas SQL estticas. Existem
duas outras subinterfaces: PreparedStatement, que estende Statement, e
CallableStatement, que estende PreparedStatement.
ResultSet uma interface que gerencia os dados resultantes retornados por uma Statement.
Observao: As palavras-chave e os comandos SQL diferenciam maisculas de minsculas, ou
seja, possvel usar SELECT ou Select. A tabela SQL e os nomes de coluna (identificadores)
podem fazer ou no distino entre maisculas e minsculas no banco de dados. Os
identificadores SQL no fazem distino entre maisculas e minsculas no banco de dados
Derby (a menos que seja delimitado).
Programao Java SE 7 14 - 5
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Usando um Objeto ResultSet
String query = "SELECT * FROM Employee";
ResultSet rs = stmt.executeQuery(query);
110 Troy Hammer 1965-03-31 102109.15
123 Michael Walton 1986-08-25 93400.20
201 Thomas Fitzpatrick 1961-09-22 75123.45
101 Abhijit Gopali 1956-06-01 70000.00
Cursor de ResultSet
rs.next()
rs.next()
rs.next()
rs.next()
rs.next()
null
A ltima chamada de mtodo next() retorna
false, e a instncia de rs agora nula.
A primeira chamada de mtodo next() retorna
true, e rs aponta para a primeira linha de dados.
Objetos ResultSet
ResultSet mantm um cursor para as linhas retornadas. O curso est apontando
inicialmente antes da primeira linha.
O mtodo ResultSet.next() chamado para posicionar o cursor na prxima linha.
O ResultSet padro no atualizvel e tem um cursor que aponta somente para
frente.
possvel produzir objetos ResultSet rolveis e/ou atualizveis. O fragmento de
cdigo a seguir, em que con um objeto Connection vlido, ilustra como tornar um
conjunto de resultados rolvel e indiferente s atualizaes feitas por outros usurio, e
atualizvel:
Statement stmt
= con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
Observao: Nem todos os bancos de dados suportam conjuntos de resultados rolveis.
ResultSet tem mtodos acessadores que leem o contedo de cada coluna retornada em
uma linha. ResultSet tem um mtodo getter para cada tipo.
Programao Java SE 7 14 - 6
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Juntando Tudo
1 package com.example.text;
2
3 import java.sql.DriverManager;
4 import java.sql.ResultSet;
5 import java.sql.SQLException;
6 import java.util.Date;
7
8 public class SimpleJDBCTest {
9
10 public static void main(String[] args) {
11 String url = "jdbc:derby://localhost:1527/EmployeeDB";
12 String username = "public";
13 String password = "tiger";
14 String query = "SELECT * FROM Employee";
15 try (Connection con =
16 DriverManager.getConnection (url, username, password);
17 Statement stmt = con.createStatement ();
18 ResultSet rs = stmt.executeQuery (query)) {
O URL do JDBC, o nome de
usurio e a senha codificados
destinam-se apenas a este
exemplo simples.
Neste slide e no slide a seguir, voc ver um exemplo completo de uma aplicao JDBC,
uma simples que l todas as linhas de um banco de dados Employee e retorna os resultados
como strings console.
Linha 15 16: Use uma instruo try-with-resources para obter uma instncia de um
objeto que implementa a interface Connection.
Linha 17: Use esse objeto para obter uma instncia de um objeto que implementa a
interface Statement no objeto Connection.
Linha 18: Crie um ResultSet executando a consulta de string usando o objeto
Statement.
Observao: A codificao do URL do JDBC, do nome de usurio e da senha torna uma
aplicao menos porttil. Em vez disso, considere o uso de java.io.Console para ler o
nome de usurio e a senha, e/ou algum tipo de servio de autenticao.
Programao Java SE 7 14 - 7
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Juntando Tudo
19 while (rs.next()) {
20 int empID = rs.getInt("ID");
21 String first = rs.getString("FirstName");
22 String last = rs.getString("LastName");
23 Date birthDate = rs.getDate("BirthDate");
24 float salary = rs.getFloat("Salary");
25 System.out.println("Employee ID: " + empID + "\n"
26 + "Employee Name: " + first + " " + last + "\n"
27 + "Birth Date: " + birthDate + "\n"
28 + "Salary: " + salary);
29 } // end of while
30 } catch (SQLException e) {
31 System.out.println("SQL Exception: " + e);
32 } // end of try-with-resources
33 }
34 }
Percorra todas as linhas
no ResultSet.
Linhas 2024: Obtenha os resultados de cada um dos campos de dados em cada linha
lidos na tabela Employee.
Linhas 2528: Imprima os campos de dados resultantes na console do sistema.
Linha 30: SQLException: Essa classe estende a Exception lanada pelos mtodos
DriverManager, Statement e ResultSet. (H mais informaes sobre essa classe
de exceo no prximo slide.)
Linha 32: Esta chave de fechamento da instruo try-with-resources na linha 15.
Este exemplo do projeto SimpleJDBCExample.
Output:
run:
Employee ID: 110
Employee Name: Troy Hammer
Birth Date: 1965-03-31
Salary: 102109.15
etc.
Programao Java SE 7 14 - 8
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Gravando Cdigo JDBC Porttil
O driver JDBC fornece uma camada de isolamento
programtica entre a aplicao Java e o banco de dados.
No entanto, tambm necessrio considerar a sintaxe e a
semntica SQL ao gravar aplicaes de banco de dados.
A maioria dos bancos de dados suportam um conjunto
padro de sintaxes e semnticas SQL descritas pela
especificao American National Standards Institute
(ANSI) SQL-92 Entry-level.
possvel verificar o suporte a essa especificao no
driver de modo programtico:
Connection con = DriverManager.getConnection(url, username,
password);
DatabaseMetaData dbm = con.getMetaData();
if (dbm.supportsANSI92EntrySQL()) {
// Support for Entry-level SQL-92 standard
}
Em geral, voc provavelmente gravar uma aplicao que aproveita as funcionalidades e os
recursos do banco de dados com o qual voc est trabalhando. No entanto, se voc quiser
gravar uma aplicao porttil, ser necessrio considerar qual suporte cada banco de dados
fornecer s funcionalidades e aos tipos SQL. Felizmente, possvel consultar o driver de
banco de dados de modo programtico para determinar qual nvel de suporte o driver
oferece. A interface DatabaseMetaData tem um conjunto de mtodos que o desenvolvedor
de driver usa para indicar o que o driver suporta, incluindo suporte intermedirio para entrada
ou suporte total para SQL-92.
A interface DatabaseMetaData tambm inclui outros mtodos que determinam qual tipo de
suporte o banco de dados fornece a consultas, tipos, transaes e muito mais.
Programao Java SE 7 14 - 9
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
A Classe SQLException
SQLException pode ser usado para relatar detalhes sobre
erros de banco de dados resultantes. Para relatar todas as
excees lanadas, faa a iterao nas SQLExceptions
lanadas:
1 catch(SQLException ex) {
2 while(ex != null) {
3 System.out.println("SQLState: " + ex.getSQLState());
4 System.out.println("Error Code:" + ex.getErrorCode());
5 System.out.println("Message: " + ex.getMessage());
6 Throwable t = ex.getCause();
7 while(t != null) {
8 System.out.println("Cause:" + t);
9 t = t.getCause();
10 }
11 ex = ex.getNextException();
12 }
13 }
Cdigos de estado
dependentes de fornecedor,
cdigos de erro e mensagens
Uma SQLException lanada a partir dos erros que ocorrem em um dos seguintes
tipos de aes: mtodos de driver, mtodos que acessam o banco de dados ou
tentativas para obter uma conexo com o banco de dados.
A classe SQLException tambm implementa Iterable. As excees podem ser
encadeadas e retornadas como um nico objeto.
SQLException ser lanada se a conexo do banco de dados no puder ser feita
devido as informaes de nome de usurio e senha incorretas ou simplesmente porque
o banco de dados est off-line.
SQLException tambm pode ser resultante da tentativa de acessar um nome de
coluna que no faz parte da consulta SQL.
SQLException tambm tem subclasse, fornecendo granularidade da exceo real
lanada.
Observao: Os valores SQLState e SQLErrorCode dependem do banco de dados. Para
o Derby, os valores SQLState so definidos aqui:
http://download.oracle.com/javadb/10.8.1.2/ref/rrefexcept71493.html.
Programao Java SE 7 14 - 10
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Fechando Objetos JDBC
Conexo
Instruo Instruo
ResultSet ResultSet
close()
Conexo
Fecha Instrues
Invalida
ResultSets
Recursos no
liberados at a
prxima coleta de lixo
Um Modo Melhor Modo
close()
Recursos
liberados
close()
close()
Fechar chamada
explicitamente ou
em try-with-resources
O fechamento de um objeto Connection resultar no fechamento automtico em
nenhum objeto Statement criado com essa Connection.
O fechamento de um objeto Statement fechar e invalidar qualquer instncia de
ResultSet criado pelo objeto Statement.
Os recursos retidos pelo ResultSet podem no ser liberados at que o lixo seja
coletado; portanto, recomendvel fechar explicitamente objetos ResultSet quando
eles no forem mais necessrios.
Quando o mtodo close() no ResultSet for executado, os recursos externos sero
liberados.
Os objetos ResultSet tambm sero implicitamente fechados quando um objeto
Statement associado for executado novamente.
Em suma, recomendvel fechar explicitamente os objetos Connection, Statement e
ResultSet quando voc no precisar mais dele.
Observao: Uma conexo com o banco de dados pode ser uma operao dispendiosa.
uma prtica recomendada manter objetos Connection pelo mximo de tempo possvel ou
usar uma pool de conexes.
Programao Java SE 7 14 - 11
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
A Construo try-with-resources
Considerando a seguinte instruo try-with-resources:
try (Connection con =
DriverManager.getConnection(url, username, password);
Statement stmt = con.createStatement ();
ResultSet rs = stmt.executeQuery (query)) {
O compilador verifica se o objeto entre parnteses
implementa java.lang.AutoCloseable.
Essa interface inclui um mtodo: void close().
O mtodo close chamado automaticamente no fim
do bloco try na ordem correta (ltima declarao at
a primeira).
Vrios recursos que podem ser fechados podem ser
includos no bloco try, separados por ponto-e-vrgulas.
Um dos recursos do JDK 7 a instruo try-with-resources. Esse um aprimoramento que
fechar automaticamente os recursos abertos.
Com o JDBC 4.1, as classes da API JDBC, incluindo ResultSet, Connection e
Statement, implementam java.lang.AutoCloseable. O mtodo close() dos objetos
ResultSet, Statement e Connection sero chamados na ordem dada neste exemplo.
Programao Java SE 7 14 - 12
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
try-with-resources: Prtica No Recomendada
Talvez seja tentador gravar try-with-resources de uma
maneira mais compacta:
try (ResultSet rs = DriverManager.getConnection(url, username,
password).createStatement().executeQuery(query)) {
No entanto, somente o mtodo close de ResultSet
chamado, o que no uma prtica recomendada.
Sempre tenha em mente quais recursos voc precisa
fechar ao usar try-with-resources.
Evite Esta Armadilha de try-with-resources
Gravar essas trs instrues pode parecer uma boa maneira de economizar tempo, mas o
efeito que a Connection retornada pelo DriverManager nunca explicitamente fechada
depois do fim do bloco, o que no uma prtica recomendada.
Programao Java SE 7 14 - 13
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Gravando Consultas e Obtendo Resultados
Para executar consultas SQL com JDBC, voc deve criar um
objeto encapsulador da consulta SQL, uma instncia do objeto
Statement.
Statement stmt = con.createStatement ();
Use a instncia Statement para executar uma consulta SQL:
ResultSet rs = stmt.executeQuery(query);
Observe que h trs mtodos de execuo Statement:
Mtodo Retorna Usado para
executeQuery(sqlString) ResultSet Instruo SELECT
executeUpdate(sqlString) int (linhas
afetadas)
INSERT, UPDATE,
DELETE ou uma
DDL
execute(sqlString) boolean (true
se houvesse um
ResultSet)
Quaisquer comandos
SQL
Uma instruo SQL executada em um banco de dados usando a instncia de um objeto
Statement. O objeto Statement um objeto encapsulador de uma consulta. Um objeto
Statement obtido atravs de um objeto Connection, a conexo do banco de dados.
Portanto, faz sentido que, a partir de uma Connection, voc receba um objeto que poder
usar para gravar instrues no banco de dados.
A interface Statement fornece trs mtodos para criar consultas SQL e retornar um resultado.
Qual deles voc usar depender do tipo de instruo SQL que deseja usar:
executeQuery(sqlString): Para uma instruo SELECT, retorna um objeto
ResultSet
executeUpdate(sqlString): Para instrues INSERT, UPDATE e DELETE, retorna
um int (nmero de linhas afetadas) ou 0 quando a instruo uma instruo Data
Definition Language (DDL); por exemplo, CREATE TABLE.
execute(sqlString): Para qualquer instruo SQL, retorna um boolean indicando
se um ResultSet foi retornado. Vrias instrues SQL podem ser executadas com
execute.
Programao Java SE 7 14 - 14
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exerccio 14-1 - Viso Geral:
Trabalhando com o Banco de Dados Derby e JDBC
Este exerccio aborda os seguintes tpicos:
Inicializao do banco de dados JavaDB (Derby) no IDE
NetBeans
Preenchimento do banco de dados com dados (a tabela
Employee)
Execuo das consultas SQL para examinar os dados
Compilao e execuo da aplicao de amostra JDBC
Neste exerccio, voc iniciar o banco de dados no NetBeans, preencher o banco de dados
com dados, executar algumas consultas SQL, e compilar e executar uma aplicao
simples que retornar as linhas da tabela de banco de dados Employee.
Programao Java SE 7 14 - 15
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
ResultSetMetaData
Talvez haja um momento em que ser necessrio descobrir
dinamicamente o nmero de colunas e seu tipo.
1 int numCols = rs.getMetaData().getColumnCount();
2 String [] colNames = new String[numCols];
3 String [] colTypes = new String[numCols];
4 for (int i= 0; i < numCols; i++) {
5 colNames[i] = rs.getMetaData().getColumnName(i+1);
6 colTypes[i] = rs.getMetaData().getColumnTypeName(i+1);
7 }
8 System.out.println ("Number of columns returned: " + numCols);
9 System.out.println ("Column names/types returned: ");
10 for (int i= 0; i < numCols; i++) {
11 System.out.println (colNames[i] + " : " + colTypes[i]);
12 }
Observe que esses
mtodos so indexados
a partir de 1, e no de 0.
A classe ResultSetMetaData obtida em um ResultSet.
A getColumnCount retorna o nmero de colunas retornadas na consulta que produziu o
ResultSet.
Os mtodos getColumnName e getColumnTypeName retornam strings. Eles podem ser
usados para executar uma recuperao dinmica dos dados da coluna.
Observao: Esses mtodos usam 1 para indicar a primeira coluna, e no 0.
Considerando a consulta "SELECT * FROM Employee" e a tabela de dados dos exerccios,
este fragmento produzir este resultado:
Number of columns returned: 5
Column names/types returned:
ID : INTEGER
FIRSTNAME : VARCHAR
LASTNAME : VARCHAR
BIRTHDATE : DATE
SALARY : REAL
Programao Java SE 7 14 - 16
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Obtendo uma Contagem de Linhas
Um pergunta comum ao executar uma consulta : Quantas
linhas foram retornadas?
1 public int rowCount(ResultSet rs) throws SQLException{
2 int rowCount = 0;
3 int currRow = rs.getRow();
4 // Valid ResultSet?
5 if (!rs.last()) return -1;
6 rowCount = rs.getRow();
7 // Return the cursor to the current position
8 if (currRow == 0) rs.beforeFirst();
9 else rs.absolute(currRow);
10 return rowCount;
11 }
Para usar essa tcnica, o ResultSet deve ser rolvel.
Mova o cursor para a ltima
linha, e esse mtodo retornar
false se o ResultSet estiver
vazio.
Retornar o cursor de linha sua
posio original antes da
chamada uma prtica
recomendada.
Observao: Lembre-se de que, para criar um ResultSet rolvel, voc deve definir o tipo
ResultSet no mtodo createStatement:
Statement stmt =
con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
H outra tcnica para ResultSets no rolveis. Usando a funo SQL COUNT, uma consulta
determina o nmero de linhas, e uma segunda l os resultados. Saiba que essa tcnica
requer o controle de bloqueio sobre as tabelas a fim de assegurar que a contagem no seja
alterada durante a operao:
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM EMPLOYEE");
rs.next();
int count = rs.getInt(1);
rs.stmt.excuteQuery ("SELECT * FROM EMPLOYEE");
// process results
Programao Java SE 7 14 - 17
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Controlando o Tamanho da Extrao de ResultSet
Por padro, o nmero de linhas extradas por vez por uma
consulta determinado pelo driver JDBC. Talvez voc queira
controlar esse comportamento para conjuntos de dados grandes.
Por exemplo, se voc quisesse limitar o nmero de linhas
extradas no cache a 25, poderia definir o tamanho da
extrao:
rs.setFetchSize(25);
As chamadas para rs.next() retorna os dados no cache
at a 26
a
linha, na qual o driver extrair outras 25 linhas.
Observao: Normalmente, o tamanho de extrao mais eficiente ainda o padro para o
driver.
Programao Java SE 7 14 - 18
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Usando PreparedStatement
PreparedStatement uma subclasse de Statement que
permite passar argumentos para uma instruo SQL pr-
compilada.
double value = 100_000.00;
String query = "SELECT * FROM Employee WHERE Salary > ?";
PreparedStatement pStmt = con.prepareStatement(query);
pStmt.setDouble(1, value);
ResultSet rs = pStmt.executeQuery();
Neste fragmento de cdigo, uma instruo preparada
retorna todas as colunas de todas as linhas cujo salrio
superior a US$ 100.000.
PreparedStatement til quando voc tem uma
instruo SQL que executar vrias vezes.
Substitui o primeiro parmetro na
instruo preparada por value.
Parmetro de substituio.
PreparedStatement
A instruo SQL no exemplo do slide pr-compilada e armazenada no objeto
PreparedStatement. Essa instruo pode ser usada de modo eficiente para ser executada
vrias vezes. Esse exemplo pode estar em um loop, examinando valores diferentes.
As instrues preparadas tambm podem ser usadas para impedir ataques de injeo SQL.
Por exemplo, quando um usurio tem permisso para informar uma string, isso, quando
executado como parte de uma instruo SQL, permite que o usurio altere o banco de dados
de formas no intencionadas (como conceder permisses a ele).
Observao: Os mtodos setXXXX PreparedStatement indexam parmetros a partir de
1, e no de 0. O primeiro parmetro em uma instruo preparada 1, o segundo parmetro
2 e assim sucessivamente.
Programao Java SE 7 14 - 19
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Usando CallableStatement
Uma CallableStatement permite que instrues no SQL
(como procedimentos armazenados) sejam executadas no
banco de dados.
CallableStatement cStmt
= con.prepareCall("{CALL EmplAgeCount (?, ?)}");
int age = 50;
cStmt.setInt (1, age);
ResultSet rs = cStmt.executeQuery();
cStmt.registerOutParameter(2, Types.INTEGER);
boolean result = cStmt.execute();
int count = cStmt.getInt(2);
System.out.println("There are " + count +
" Employees over the age of " + age);
Os procedimentos armazenados so executados no banco
de dados.
O parmetro IN passado para
o procedimento armazenado.
O parmetro OUT retornado
pelo procedimento armazenado.
Procedimentos Armazenados do Derby
O banco de dados Derby usa a linguagem de programao Java para seus procedimentos
armazenados.
No exemplo mostrado no slide, o procedimento armazenado declarado usando a seguinte
sintaxe:
CREATE PROCEDURE EmplAgeCount (IN age INTEGER, OUT num INTEGER)
DYNAMIC RESULT SETS 0
LANGUAGE JAVA
EXTERNAL NAME 'DerbyStoredProcedure.countAge'
PARAMETER STYLE JAVA
READS SQL DATA;
Uma classe Java carregada no banco de dados Derby usando a seguinte sintaxe:
CALL SQLJ.install_jar ('D:\temp\DerbyStoredProcedure.jar',
'PUBLIC.DerbyStoredProcedure', 0);
CALL
syscs_util.syscs_set_database_property('derby.database.classpath',
'PUBLIC.DerbyStoredProcedure');
Programao Java SE 7 14 - 20
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
A classe Java armazenada no banco de dados Derby que executa o procedimento
armazenado calcula uma data que representa alguns anos no passado com base na data de
hoje. A consulta SQL conta o nmero de funcionrios exclusivos que so mais velhos que o
nmero de anos transmitidos ou igual ao nmero de anos transmitidos. Em seguida, ela
retorna essa contagem como o segundo parmetro do procedimento armazenado. O cdigo
deste exemplo ter a seguinte aparncia:
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
public class DerbyStoredProcedure {
public static void countAge (int age, int[] count) throws SQLException {
String url = "jdbc:default:connection";
Connection con = DriverManager.getConnection (url);
String query = "SELECT COUNT(DISTINCT ID) " +
"AS count FROM Employee " +
"WHERE Birthdate <= ?";
PreparedStatement ps = con.prepareStatement(query);
Calendar now = Calendar.getInstance();
now.add(Calendar.YEAR, (age*-1));
Date past = new Date (now.getTimeInMillis());
ps.setDate(1, past);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
count[0] = rs.getInt(1);
} else {
count[0] = 0;
}
con.close();
}
}
Consulte o Derby Reference Manual e o Derby Tools and Utilities Guide para obter mais
informaes sobre como criar procedimentos armazenados.
Programao Java SE 7 14 - 21
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Um exemplo clssico de quando uma transao ser usada o seguinte. Suponhamos que
uma aplicao cliente precise fazer uma solicitao de servio que possa envolver vrias
operaes de leitura e gravao para um banco de dados. Se alguma chamada for mal-
sucedida, qualquer estado gravado (na memria ou, geralmente, em um banco de dados)
dever ser submetido a rollback.
Considere uma aplicao de transferncia de fundos entre bancos em que o dinheiro
transferido de um banco para outro.
A operao de transferncia requer que o servidor faa as seguintes chamadas:
1. Chame o mtodo de dbito em uma conta no primeiro banco
2. Chame o mtodo de crdito em outra conta no segundo banco
Se a chamada de crdito no segundo banco apresentar falha, a aplicao bancria dever
submeter a chamada de dbito anterior a rollback no primeiro banco.
Observao: Quando uma transao abranger vrios bancos de dados, talvez sejam
necessrios servios de transao mais complicados.
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
O Que Uma Transao?
Uma transao um mecanismo para tratar grupos
de operaes como se eles fossem um s.
As operaes em uma transao ocorrem todas ao
mesmo tempo; do contrrio, no ocorrer
nenhuma.
As operaes envolvidas em uma transao podem
se basear em um ou mais bancos de dados.
Programao Java SE 7 14 - 22
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
As transaes devem ter as seguintes propriedades ACID:
Atomicidade: Tudo ou nada; as operaes envolvidas na transao so
implementadas todas ao mesmo tempo ou nenhuma delas implementada.
Consistncia: O banco de dados deve ser modificado de um estado consistente para
outro. Caso o sistema ou banco de dados apresente falha durante a transao, o
estado original ser restaurado (submetido a rollback).
Isolamento: Uma transao de execuo isolada de outras transaes de execuo
nos termos dos registros de banco de dados que ela est acessando.
Durabilidade: Depois que uma transao for confirmada, ela poder ser restaurada
para esse estado caso ocorra uma falha no sistema ou banco de dados.
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Propriedades ACID de Uma Transao
Uma transao formalmente definida pelo conjunto de
propriedades conhecido pelo acrnimo ACID.
Atomicidade: Uma transao feita ou desfeita
completamente. Caso haja uma falha, todas as operaes
e procedimentos sero desfeitas, e todos os dados sero
submetidos a rollback e sero revertidos ao estado
anterior.
Consistncia: Uma transao transforma um sistema de
um estado consistente para outro estado consistente.
Isolamento: Cada transao ocorre independentemente
de outras transaes que ocorram ao mesmo tempo.
Durabilidade: As transaes concludas continuaro
permanentes, mesmo durante a falha do sistema.
Programao Java SE 7 14 - 23
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
As transaes so apropriadas nos seguintes cenrios. Cada situao descreve um modelo
de transao que suportado pela implementao do modelo de transao local do recurso
na instncia do EntityManager.
Uma aplicao cliente deve se comunicar com um objeto gerenciado e fazer vrias
chamadas em uma instncia de objeto especfica. A conversa pode ser caracterizada por
uma ou mais destas condies:
A. Os dados so armazenados no cache da memria ou gravados em um banco de dados
durante ou aps cada chamada sucessiva.
B. Os dados so gravados em um banco de dados no fim da conversa.
C. A aplicao cliente requer que o objeto mantenha um contexto na memria entre cada
chamada; cada chamada sucessiva usa os dados mantidos na memria.
D. Aps a conversa, a aplicao cliente precisar ser capaz de cancelar todas as
operaes de gravao de banco de dados que possam ter ocorrido durante ou no fim
da conversa.
Considere uma aplicao de carrinho. Os usurios da aplicao cliente navegam em um
catlogo on-line e fazem vrias selees de compra. Eles do continuidade verificao e
inserem as informaes do carto de crdito para fazer a compra. Se a verificao do carto
de crdito apresentar falha, a aplicao de compra dever cancelar todas as selees de
compra pendentes no carrinho ou submeter a rollback as transaes de compra feitas
durante a conversa.
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Transferindo sem Transaes
Transferncia bem-sucedida (A)
Transferncia malsucedida (As contas so deixadas
em um estado inconsistente) (B)
$1000
+$100
$1100
$500
-$100
$400
2) Depsito: $100
1) Retirada: $100
Transferncia:
$100
De: Conta 1
Para: Conta 2
Caixa
Automtico
Conta 1
Conta 2
$1000
$500
-$100
$400
1) Retirada: $100
Transferncia:
$100
De: Conta 1
Para: Conta 2
Caixa
Automtico
A
B
Falha no
Depsito
Banco
Banco
Conta 1
Conta 2
Programao Java SE 7 14 - 24
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Se a transao for bem-sucedida, as alteraes armazenadas em buffer sero submetidas a
commit, ou seja, se tornaro permanentes.
No escopo de uma chamada de cliente em um objeto, este far vrias alteraes nos dados
de um banco de dados. Se uma alterao apresentar falha, o objeto dever submeter todas
as alteraes a rollback. Considere uma aplicao bancria. O cliente chama a operao de
transferncia em um objeto de caixa automtico. A operao requer que o objeto de caixa
automtico faa as seguintes chamadas no banco de dados do banco:
1. Chame o mtodo de dbito em uma conta
2. Chame o mtodo de crdito em outra conta
Se a chamada de crdito no banco de dados do banco apresentar falha, a aplicao bancria
dever submeter a chamada de dbito anterior a rollback.
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Transferncia Bem-sucedida em Transaes
As alteraes em uma transao so armazenadas em
buffer. (A)
Se uma transferncia for bem-sucedida, as alteraes sero
submetidas a commit (se tornaro permanentes). (B)
$1100
$400
Commit
Transferncia
Bem-sucedida
Commit
$1000
+$100
$1100
$500
-$100
$400
2) Depsito: $100
1) Retirada: $100
Transferncia:
$100
De: Conta 1
Para: Conta 2
Caixa
Automtico
Conta 1
Conta 2
A
Banco
Transao Iniciada pelo Banco
Conta 1
Conta 2
Caixa
Automtico
B
Banco
Transao Iniciada pelo Banco
Programao Java SE 7 14 - 25
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Se a transao for malsucedida, as alteraes armazenadas em buffer sero lanadas e o
banco de dados ser submetido a rollback e revertido ao estado consistente anterior.
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Transferncia Malsucedida em Transaes
As alteraes em uma transao so armazenadas em
buffer. (A)
Se ocorrer algum problema, a transao ser submetida
a rollback e revertida ao estado consistente anterior. (B)
$500
-$100
$400
1) Retirada: $100
Transferncia:
$100
De: Conta 1
Para: Conta 2
Caixa
Automtico
Conta 1
Conta 2
A
Banco
Transao Iniciada pelo Banco
$1000
Falha no
Depsito
$1000
$500
Rollback
Mensagem
de Erro
Rollback
Caixa
Automtico
B
Banco
Transao Iniciada pelo Banco
Conta 1
Conta 2
Programao Java SE 7 14 - 26
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Transaes JDBC
Por padro, quando uma Connection criada, ela fica no
modo de commit automtico.
Cada instruo SQL individual tratada como uma
transao e submetida a commit automaticamente depois
que executada.
Para agrupar duas ou mais instrues, desative o modo
de commit automtico.
con.setAutoCommit (false);
Voc deve chamar explicitamente o mtodo de commit
para concluir a transao com o banco de dados.
con.commit();
Tambm possvel submeter as transaes a rollback de
modo programtico caso ocorra uma falha.
con.rollback();
Por padro, o JDBC faz o commit automtico das instrues SQL. No entanto, quando voc
quer criar uma operao atmica que envolva vrias instrues SQL, deve desativar o
commit automtico.
Depois que o commit automtico desativado, nenhuma instruo SQL submetida a
commit enquanto voc no chama explicitamente o mtodo de commit.
A outra vantagem de gerenciar suas prprias transaes a capacidade de submeter a
rollback um conjunto de instrues SQL caso ocorra uma falha ao usar o mtodo de rollback.
Observao: O JDBC no tem uma API para iniciar explicitamente uma transao. O JDBC
JSR (221) fornece as seguintes diretrizes:
Quando o commit automtico for desativado para um objeto Connection, todas as
Statements subsequentes ficaro em um contexto de transao at que o mtodo de
commit ou rollback de Connection seja executado.
Se o valor de commit automtico for alterado no meio de uma transao, a transao
atual ser submetida a commit.
Alm disso, a documentao do driver Derby adicionar o seguinte:
Um contexto de transao associado a um nico objeto Connection (e banco de
dados). Uma transao no pode abranger vrias Connections (ou bancos de dados).
Observao: Uma aplicao de amostra usando transaes est no arquivo de projeto
JDBCTransactionsExample, no diretrio de exemplos.
Programao Java SE 7 14 - 27
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
RowSet 1.1: RowSetProvider e RowSetFactory
A especificao da API do JDK 7 incorpora a nova API
do RowSet 1.1. Um dos novos recursos desta API
RowSetProvider.
javax.sql.rowset.RowSetProvider usado para
criar um objeto RowSetFactory:
myRowSetFactory = RowSetProvider.newFactory();
A implementao padro de RowSetFactory :
com.sun.rowset.RowSetFactoryImpl
RowSetFactory usado para criar um dos tipos de
objeto RowSet de RowSet 1.1.
RowSet 1.1
Recursos novos no JDK7 so as classes javax.sql.rowset.RowSetProvider e
javax.sql.rowset.RowSetFactory. Essas duas classes so usadas para construir
instncias de RowSets, conforme abordado no prximo slide.
Programao Java SE 7 14 - 28
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Usando RowSetFactory de RowSet 1.1
RowSetFactory usado para criar instncias de
implementaes de RowSet:
Tipo de RowSet Fornece
CachedRowSet
Um continer de linhas de dados que armazena suas
linhas no cache da memria
FilteredRowSet
Um objeto RowSet que fornece mtodos para filtrar o
suporte
JdbcRowSet
Um encapsulador de ResultSet que trata um conjunto
de resultados como um componente JavaBeans
JoinRowSet
Um objeto RowSet que fornece mecanismos para
combinar dados relacionados de diferentes objetos
RowSet
WebRowSet
Um objeto RowSet que suporta o formato de
documento XML padro necessrio ao descrever um
objeto RowSet em XML
CachedRowSet: Um objeto CachedRowSet um continer de linhas de dados que
armazena suas linhas no cache da memria. Isso possibilita a operao sem precisar
estar sempre conectado fonte de dados. Alm disso, ele um componente
JavaBeans, rolvel, atualizvel e serializvel. Um objeto CachedRowSet geralmente
contm linhas de um conjunto de resultados, mas tambm pode conter linhas de
qualquer arquivo com um formato tabular, como uma planilha. A implementao de
referncia suporta a obteno de dados somente de um objeto ResultSet, mas os
desenvolvedores podem estender as implementaes de SyncProvider para fornecer
acesso a outras fontes de dados tabulares.
FilteredRowSet: Uma implementao padro do FilteredRowSet do JDBC
implementa as interfaces RowSet e estende a classe CachedRowSet. A classe
CachedRowSet fornece um conjunto de mtodos de manipulao de cursor protegidos,
que uma implementao de FilteredRowSet pode substituir para fornecer suporte
filtragem.
Programao Java SE 7 14 - 29
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
JdbcRowSet: O JdbcRowSet encapsulador de um objeto ResultSet que
possibilita o uso do conjunto de resultados como um componente JavaBeans. Desse
modo, um objeto JdbcRowSet pode ser um dos Beans que uma ferramenta
disponibiliza para compor uma aplicao. Como um JdbcRowSet um rowset, ou seja,
mantm continuamente sua conexo com um banco de dados usando um driver
habilitado para tecnologia JDBC, ele tambm torna o driver um componente
JavaBeans.
JoinRowSet: A interface JoinRowSet fornece um mecanismo para combinar dados
relacionados de diferentes objetos RowSet em um nico objeto JoinRowSet, que
representa um SQL JOIN. Em outras palavras, um objeto JoinRowSet age como um
continer dos dados dos objetos RowSet que formam um relacionamento SQL JOIN.
WebRowSet: A interface WebRowSet descreve o formato de documento XML padro
necessrio ao descrever um objeto RowSet em XML, e deve ser usada por todas as
implementaes padro da interface WebRowSet para garantir a interoperabilidade.
Alm disso, o esquema WebRowSet usa anotaes de Esquema SQL/XML especficas,
garantindo assim maior interoperabilidade entre plataformas. Essa uma iniciativa que
est em andamento na organizao ISO.
Programao Java SE 7 14 - 30
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exemplo: Usando JdbcRowSet
1 try (JdbcRowSet jdbcRs =
2 RowSetProvider.newFactory().createJdbcRowSet()) {
3 jdbcRs.setUrl(url);
4 jdbcRs.setUsername(username);
5 jdbcRs.setPassword(password);
6 jdbcRs.setCommand("SELECT * FROM Employee");
7 jdbcRs.execute();
8 // Now just treat JDBC Row Set like a ResultSet object
9 while (jdbcRs.next()) {
10 int empID = jdbcRs.getInt("ID");
11 String first = jdbcRs.getString("FirstName");
12 String last = jdbcRs.getString("LastName");
13 Date birthDate = jdbcRs.getDate("BirthDate");
14 float salary = jdbcRs.getFloat("Salary");
15 }
16 //... other methods
17 }
No fragmento de cdigo do slide, voc cria uma instncia de JdbcRowSet em
RowSetProviderFactory.
Depois, voc trata o objeto como um JavaBean RowSet. possvel usar os mtodos
setter para definir o url, o username e a password, executar um comando SQL e, por
fim, obter um ResultSet para recuperar os valores de coluna.
Este exemplo do projeto SimpleJDBCRowSetExample.
Programao Java SE 7 14 - 31
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Objetos de Acesso a Dados
Considere uma tabela de funcionrios como a do cdigo
JDBC de amostra.
Combinando o cdigo que acessa o banco de dados com
a lgica de negcios, os mtodos de acesso a dados e a
tabela Employee estaro estreitamente associadas.
Qualquer alterao feita na tabela (como adicionar um
campo) exigir uma alterao completa na aplicao.
Os dados do funcionrio no so encapsulados na
aplicao de exemplo.
A Tabela Employee
Na aplicao SimpleJDBCExample mostrada no slide anterior, h estreita associao entre
as operaes usadas para acessar os dados e a tabela Employee propriamente dita. O
exemplo simples, mas se voc imaginar esse tipo de acesso em uma aplicao maior,
talvez com vrias tabelas com relacionamentos entre tabelas, voc poder ver como acessar
diretamente o banco de dados na mesma classe, j que os mtodos de negcios poderiam
gerar problemas posteriormente se a tabela Employee tivesse que ser alterada.
Alm disso, como voc est acessando os dados diretamente, no ter nenhuma maneira de
transmitir a noo de um Funcionrio. necessrio tratar um Funcionrio como objeto.
Programao Java SE 7 14 - 32
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
O Padro do Objeto de Acesso a Dados
1
2
3
O Objeto de Acesso a Dados e Padro de Fbrica
A finalidade do Objeto de Acesso a Dados (DAO) separar as atividades relacionadas a
banco de dados do modelo de negcios. Nesse padro de design, h duas tcnicas para
assegurar a flexibilidade de design futura.
1. Uma fbrica usada para gerar instncias (referncias) em uma implementao da
interface EmployeeDAO. Uma fbrica possibilita a abstrao do desenvolvedor usando
o DAO nos detalhes sobre como uma implementao de DAO instanciada. Como
voc viu, esse mesmo padro foi usado para criar uma implementao em que os
dados foram armazenados na memria
2. Uma interface EmployeeDAO foi projetada para modelar o comportamento que voc
deseja permitir nos dados do Funcionrio. Observe que essa tcnica de criar uma
separao entre comportamento e dados demonstra uma separao de objetivos. A
interface EmployeeDAO incentiva a separao adicional entre a implementao dos
mtodos necessrios para suportar o DAO e as referncias aos objetos EmployeeDAO.
3. A EmployeeDAOJDBCImplimplementa a interface EmployeeDAO. A classe de
implementao pode ser substituda por outra implementao sem impactar a aplicao
cliente.
Programao Java SE 7 14 - 33
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Resumo
Nesta lio, voc aprendeu a:
Definir o layout da API JDBC
Conectar-se a um banco de dados usado um driver JDBC
Enviar consultas e obter resultados do banco de dados
Especificar informaes do driver JDBC externamente
Usar transaes com JDBC
Usar o RowSetProvider e RowSetFactory do JDBC 4.1
Usar um Padro do Objeto de Acesso a Dados
para separar dados e mtodos de negcio
Programao Java SE 7 14 - 34
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Qual mtodo Statement executa uma instruo SQL
e retorna o nmero de linhas afetadas?
a. stmt.execute(query);
b. stmt.executeUpdate(query);
c. stmt.executeQuery(query);
d. stmt.query(query);
Programao Java SE 7 14 - 35
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Ao usar uma Statement para executar uma consulta que
retorna somente um registro, no necessrio usar o mtodo
next() de ResultSet.
a. Verdadeiro
b. Falso
Programao Java SE 7 14 - 36
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
A seguinte instruo try-with-resources fechar corretamente
os recursos do JDBC:
try (Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery (query)) {
//...
} catch (SQLException s) {
}
a. Verdadeiro
b. Falso
Programao Java SE 7 14 - 37
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Considerando:
10 String[] params = {"Bob", "Smith"};
11 String query = "SELECT itemCount FROM Customer " +
12 "WHERE lastName='?' AND firstName='?'";
13 try (PreparedStatement pStmt = con.prepareStatement(query)) {
14 for (int i = 0; i < params.length; i++)
15 pStmt.setObject(i, params[i]);
16 ResultSet rs = pStmt.executeQuery();
17 while (rs.next()) System.out.println (rs.getInt("itemCount"));
18 } catch (SQLException e){ }
Assumindo que h um objeto Connection vlido, e a consulta SQL
produzir pelo menos uma linha, qual ser o resultado?
a. Cada valor itemCount do cliente Bob Smith
b. Erro de compilador
c. Um erro de runtime
d. Uma SQLException
Programao Java SE 7 14 - 38
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exerccio 14-2 - Viso Geral:
Usando o Padro do Objeto de Acesso a Dados
Este exerccio aborda os seguintes tpicos:
Refatoramento da aplicao DAO baseada em memria
para usar o JDBC.
Teste do cdigo por meio da aplicao cliente interativa do
Funcionrio
Neste exerccio, voc refatorar o DAO baseado em memria existente a partir das Excees
e Asseres para usar o JDBC em vez disso. Um cliente interativo fornecido para que voc
possa testar ao criar, ler, atualizar e deletar registros usando o JDBC.
Programao Java SE 7 14 - 39
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Localizao
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Objetivos
Aps concluir esta lio, voc ser capaz de:
Descrever as vantagens da localizao de uma aplicao
Definir o que uma localidade representa
Ler e definir a localidade usando o objeto Locale
Criar um resource bundle para cada localidade
Chamar um resource bundle a partir de uma aplicao
Alterar a localidade de um resource bundle
Formatar texto para localizao usando NumberFormat
e DateFormat
Programao Java SE 7 15 - 2
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Por Que Localizar?
A deciso de criar a verso de uma aplicao para uso
internacional geralmente acontece no incio de um projeto
de desenvolvimento.
Software que reconhece regio e idioma
Datas, nmeros e moedas formatados para pases
especficos
Capacidade de conectar dados especficos de pas
sem alterar o cdigo
A localizao o processo de adaptao do software para uma regio ou idioma especfico por
meio da adio de componentes especficos de localidade e da traduo de texto.
Alm das alteraes de idioma, elementos que dependem da cultura do local, como datas,
nmeros, moedas etc., devem ser traduzidos.
A meta projetar a localizao a fim de que nenhuma alterao de cdigo seja necessria.
Programao Java SE 7 15 - 3
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Uma Aplicao de Amostra
Localize uma aplicao de amostra:
Interface de usurio baseada em texto
Localizao de menus
Exibio de localizaes de data e moeda
=== Localization App ===
1. Set to English
2. Set to French
3. Set to Chinese
4. Set to Russian
5. Show me the date
6. Show me the money!
q. Enter q to quit
Enter a command:
No restante dessa lio, essa interface de usurio simples baseada em texto ser localizada para
francs, chins simplificado e russo. Informe o nmero indicado pelo menu, e essa opo de
menu ser aplicada. Informe q para sair da aplicao.
Programao Java SE 7 15 - 4
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Locale
Uma Locale especifica um idioma e um pas especfico:
Idioma
Um cdigo alfa-2 ou alfa-3 ISO 639
en para ingls, es para espanhol
Sempre usa letras minsculas
Pas
Usa o cdigo de pas alfa-2 ISO 3166 ou o cdigo de rea
numrico UN M.49
"US" para Estados Unidos, "ES" para Espanha
Sempre usa letras maisculas
Consulte o site The Java Tutorials para obter detalhes de
todos os padres usados
No Java, uma localidade especificada usando dois valores: idioma e pas. Consulte o Tutorial
Java para obter os padres usados:
http://download.oracle.com/javase/tutorial/i18n/locale/create.html
Amostras de Idioma
de: Alemo
en: Ingls
fr: Francs
zh: Chins
Amostras de Pas
DE: Alemanha
US: Estados Unidos
FR: Frana
CN: China
Programao Java SE 7 15 - 5
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Resource Bundle
A classe ResourceBundle isola dados especficos de
localidade:
Retorna pares de chave/valor armazenados separadamente
Pode ser uma classe ou um arquivo .properties
Etapas para uso:
Criar arquivos de bundle para cada localidade.
Chamar uma localidade especfica na aplicao.
O design para localizao comea com a criao da aplicao de modo que todos os textos, sons
e imagens possam ser substitudos em runtime pelos elementos apropriados da regio e da
cultura desejadas. Os resource bundles contm pares de chave/valor que podem ser codificados
em uma classe ou localizados em um arquivo .properties.
Programao Java SE 7 15 - 6
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Arquivos de Resource Bundle
O arquivo de propriedades contm um conjunto de pares de
chave/valor.
Cada chave identifica um componente de aplicao especfico.
Os nomes de arquivo especiais usam cdigos de idioma e pas.
Padro da aplicao de amostra:
Menu convertido em resource bundle
MessageBundle.properties
menu1 = Set to English
menu2 = Set to French
menu3 = Set to Chinese
menu4 = Set to Russian
menu5 = Show the Date
menu6 = Show me the money!
menuq = Enter q to quit
O slide mostra um arquivo de resource bundle de amostra para esta aplicao. Cada opo de
menu foi convertida em um par de nome/valor. Esse o arquivo padro da aplicao. Para
idiomas alternativos, uma conveno de nomenclatura especial usada:
MessageBundle_xx_YY.properties
em que xx o cdigo de idioma e YY o cdigo de pas.
Programao Java SE 7 15 - 7
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Arquivos de Resource Bundle de Amostra
Amostras para Francs e Chins
MessagesBundle_fr_FR.properties
menu1 = Rgler l'anglais
menu2 = Rgler au franais
menu3 = Rglez chinoise
menu4 = Dfinir pour la Russie
menu5 = Afficher la date
menu6 = Montrez-moi l'argent!
menuq = Saisissez q pour quitter
MessagesBundle_zh_CN.properties
menu1 =
menu2 =
menu3 =
menu4 =
menu5 =
menu6 =
menuq = q
O slide mostra os arquivos de resource bundle para francs e chins. Observe que os nomes de
arquivo incluem idioma e pas. O item de menu em ingls foi substitudo pelas alternativas em
francs e chins.
Programao Java SE 7 15 - 8
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Qual arquivo de bundle representa o idioma espanhol e o
cdigo de pas US?
a. MessagesBundle_ES_US.properties
b. MessagesBundle_es_es.properties
c. MessagesBundle_es_US.properties
d. MessagesBundle_ES_us.properties
Programao Java SE 7 15 - 9
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Inicializando a Aplicao de Amostra
PrintWriter pw = new PrintWriter(System.out, true);
// More init code here
Locale usLocale = Locale.US;
Locale frLocale = Locale.FRANCE;
Locale zhLocale = new Locale("zh", "CN");
Locale ruLocale = new Locale("ru", "RU");
Locale currentLocale = Locale.getDefault();
ResourceBundle messages = ResourceBundle.getBundle("MessagesBundle",
currentLocale);
// more init code here
public static void main(String[] args) {
SampleApp ui = new SampleApp();
ui.run();
}
Com os resource bundles criados, voc simplesmente precisa carregar os bundles na aplicao.
O cdigo-fonte no slide mostra as etapas. Primeiro, crie um objeto Locale que especifique o
idioma e o pas. Em seguida, carregue o resource bundle especificando o nome de arquivo bsico
do bundle e a Locale atual.
Observe que h vrias maneiras de definir uma Locale. A classe Locale inclui constantes
padro de alguns pases. Se uma constante no estiver disponvel, voc poder usar o cdigo de
idioma com o cdigo de pas para definir o local. Por fim, ser possvel usar o mtodo
getDefault() para obter o local padro.
Programao Java SE 7 15 - 10
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Aplicao de Amostra: Loop Principal
public void run() {
String line = "";
while (!(line.equals("q"))){
this.printMenu();
try { line = this.br.readLine(); }
catch (Exception e){ e.printStackTrace(); }
switch (line){
case "1": setEnglish(); break;
case "2": setFrench(); break;
case "3": setChinese(); break;
case "4": setRussian(); break;
case "5": showDate(); break;
case "6": showMoney(); break;
}
}
}
Nessa aplicao, um mtodo run contm o loop principal. O loop executado at que a letra q
seja digitada como entrada. Uma alternncia de string usada para executar uma operao com
base no nmero informado. Uma chamada simples feita em cada mtodo para efetuar
alteraes de localidade e exibir a sada formatada.
Programao Java SE 7 15 - 11
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
O Mtodo printMenu
Em vez do texto, o resource bundle usado.
messages um resource bundle.
Uma chave usada para recuperar cada item de menu.
O idioma selecionado com base na configurao
Locale.
public void printMenu(){
pw.println("=== Localization App ===");
pw.println("1. " + messages.getString("menu1"));
pw.println("2. " + messages.getString("menu2"));
pw.println("3. " + messages.getString("menu3"));
pw.println("4. " + messages.getString("menu4"));
pw.println("5. " + messages.getString("menu5"));
pw.println("6. " + messages.getString("menu6"));
pw.println("q. " + messages.getString("menuq"));
System.out.print(messages.getString("menucommand")+" ");
}
Em vez de imprimir o texto, o resource bundle (messages) chamado e a Locale atual
determina qual idioma apresentado ao usurio.
Programao Java SE 7 15 - 12
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Alterando a Locale
Para alterar a Locale:
Defina currentLocale como idioma desejado.
Recarregue o bundle usando a localidade atual.
public void setFrench(){
currentLocale = frLocale;
messages = ResourceBundle.getBundle("MessagesBundle",
currentLocale);
}
Depois que o bundle de menu atualizado com a localidade correta, o texto da interface
retornado usando o idioma atualmente selecionado.
Programao Java SE 7 15 - 13
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Interface de Amostra com Francs
Depois que a opo French for selecionada, a interface
de usurio atualizada ter a seguinte aparncia:
=== Localization App ===
1. Rgler l'anglais
2. Rgler au franais
3. Rglez chinoise
4. Dfinir pour la Russie
5. Afficher la date
6. Montrez-moi l'argent!
q. Saisissez q pour quitter
Entrez une commande:
A interface de usurio atualizada mostrada no slide. A primeira e ltima linhas da aplicao
pode ser localizada tambm.
Programao Java SE 7 15 - 14
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Formatar Data e Moeda
Os nmeros podem ser localizados e exibidos no formato
local.
As classes de formato especiais incluem:
DateFormat
NumberFormat
Crie objetos usando Locale.
A alterao de texto no a nica ferramenta de localizao disponvel. As datas e os nmeros
tambm podem ser formatados com base em padres locais.
Programao Java SE 7 15 - 15
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Inicializar Data e Moeda
A aplicao pode mostrar uma data e uma moeda com o
formato local. As variveis so inicializadas da seguinte forma:
// More init code precedes
NumberFormat currency;
Double money = new Double(1000000.00);
Date today = new Date();
DateFormat df;
Antes que qualquer formatao entre em vigor, os objetos de data e nmero devem ser
configurados. A data de hoje e um objeto Double so usados nessa aplicao.
Programao Java SE 7 15 - 16
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exibindo uma Data
Formate uma data:
Obtenha um objeto DateFormat com base na Locale.
Chame o mtodo format passando a data a ser formatada.
public void showDate(){
df = DateFormat.getDateInstance(DateFormat.DEFAULT, currentLocale);
pw.println(df.format(today) + " " + currentLocale.toString());
}
Datas de amostra:
20 juil. 2011 fr_FR
20.07.2011 ru_RU
Crie um objeto de formato de data usando a localidade, e a data ser formatada para a localidade
selecionada.
Programao Java SE 7 15 - 17
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Personalizando uma Data
As constantes DateFormat incluem:
SHORT: completamente numrica, como 12.13.52 ou
3:30pm
MEDIUM: mais longa, como Jan 12, 1952
LONG: mais longa, como January 12, 1952 ou 3:30:32pm
FULL: completamente especificada, como Tuesday, April
12, 1952 AD ou 3:30:42pm PST
SimpleDateFormat:
Uma subclasse da classe DateFormat
Letra Data ou Hora Apresentao Exemplos
G Era Text AD
y Year Year 1996; 96
M Month in Year Month July; Jul; 07
O objeto DateFormat inclui um nmero de constantes que voc pode usar para formatar a sada
da data.
A classe SimpleDateFormat uma subclasse de DateFormat e oferece a voc grande
controle sobre a sada de data. Consulte a documentao para obter todas as opes
disponveis.
Em alguns casos, o nmero de letras pode determinar a sada. Por exemplo, com ms:
MM 07
MMM Jul
MMMM July
Programao Java SE 7 15 - 18
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exibindo Moeda
Formate a moeda:
Obtenha uma instncia de moeda em NumberFormat.
Passe Double para o mtodo format.
public void showMoney(){
currency = NumberFormat.getCurrencyInstance(currentLocale);
pw.println(currency.format(money) + " " + currentLocale.toString());
}
Amostra de sada de moeda:
1 000 000 . ru_RU
1 000 000,00 fr_FR
1,000,000.00 zh_CN
Crie um objeto NumberFormat usando a localidade selecionada e obtenha a sada formatada.
Programao Java SE 7 15 - 19
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Quiz
Qual constante de formato de data fornece as informaes
mais detalhadas?
a. LONG
b. FULL
c. MAX
d. COMPLETE
Programao Java SE 7 15 - 20
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Resumo
Nesta lio, voc aprendeu a:
Descrever as vantagens da localizao de uma aplicao
Definir o que uma localidade representa
Ler e definir a localidade usando o objeto Locale
Criar um resource bundle para cada localidade
Chamar um resource bundle a partir de uma aplicao
Alterar a localidade de um resource bundle
Formatar texto para localizao usando
NumberFormat e DateFormat
Programao Java SE 7 15 - 21
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Exerccio 15-1 - Viso Geral:
Criando uma Aplicao de Data Localizada
Este exerccio aborda a criao de uma aplicao localizada
que exibe datas em vrios formatos.
Programao Java SE 7 15 - 22
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
(Opcional) Exerccio 15-2 - Viso Geral:
Localizando uma Aplicao JDBC
Este exerccio aborda a criao de uma verso localizada da
aplicao JDBC na lio anterior.
Programao Java SE 7 15 - 23
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
SQL Primer
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 2
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Objetivos
Aps concluir esta lio, voc ser capaz de:
Descrever a sintaxe dos comandos SQL-92/1999 bsicos:
SELECT
INSERT
UPDATE
DELETE
CREATE TABLE
DROP TABLE
Definir os tipos de dados
SQL-92/1999 bsicos
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 3
Em um banco de dados relacional, no necessrio especificar a rota de acesso para as
tabelas nem saber como os dados so organizados fisicamente.
Para acessar o banco de dados, uma instruo SQL (Structured Query Language)
executada; ela a linguagem padro ANSI (American National Standards Institute) para
bancos de dados relacionais operacionais. A SQL um conjunto de instrues com as quais
todos os programas e usurios acessam dados no Banco de Dados Oracle. Os programas e
as ferramentas Oracle geralmente permitem que os usurios acessem o banco de dados
sem usar a SQL diretamente, mas essas aplicaes, por sua vez, devem usar a SQL ao
executar a solicitao do usurio.
A SQL fornece instrues para diversas tarefas:
Consulta de dados
Insero, atualizao e deleo de linhas em uma tabela
Criao, substituio, alterao e eliminao de objetos
Controle do acesso ao banco de dados e respectivos objetos
Garantia da consistncia e integridade do banco de dados
A SQL unifica todas as tarefas precedentes em um nica linguagem consistente e permite o
trabalho com dados em um nvel lgico.
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Usando SQL para Consultar o Banco de Dados
A SQL (Structured Query Language) :
A linguagem padro ANSI de bancos de dados relacionais
operacionais
Eficaz, fcil de aprender e usar
Funcionalmente completa (com a SQL, possvel definir,
recuperar e manipular dados nas tabelas.)
SELECT department_name
FROM departments;
Banco
de dados
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 4
As instrues SQL suportadas pela Oracle esto em conformidade com os padres do setor.
A Oracle Corporation garante a conformidade futura com os padres em desenvolvimento
envolvendo ativamente funcionrios essenciais que fazem parte dos comits de padres SQL.
Os comits aceitos pelo setor so ANSI e ISO (International Standards Organization). Os
padres ANSI e ISO aceitaram a SQL como linguagem padro para bancos de dados
relacionais.
Instruo Descrio
SELECT
INSERT
UPDATE
DELETE
MERGE
Recupera dados do banco de dados, insere novas linhas, altera linhas existentes e
remove linhas indesejveis de tabelas do banco de dados, respectivamente.
Coletivamente conhecida como DML (Data Manipulation Language)
CREATE
ALTER
DROP
RENAME
TRUNCATE
COMMENT
Configura, altera e remove estruturas de dados das tabelas. Coletivamente
conhecida como DDL (Data Definition Language)
GRANT
REVOKE
Fornece ou remove direitos de acesso para o Banco de Dados Oracle e as
estruturas contidas nele
COMMIT
ROLLBACK
SAVEPOINT
Gerencia as alteraes feitas por instrues DML. possvel agrupar as
alteraes dos dados em transaes lgicas

Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Instrues SQL
SELECT
INSERT
UPDATE
DELETE
MERGE
CREATE
ALTER
DROP
RENAME
TRUNCATE
COMMENT
GRANT
REVOKE
COMMIT
ROLLBACK
SAVEPOINT
DML (Data Manipulation Language)
DDL (Data Definition Language)
Controle de transao
DCL (Data Control Language)
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 5
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Instruo SELECT Bsica
SELECT identifica as colunas a serem exibidas.
FROM identifica a tabela que contm essas colunas.
SELECT *|{[DISTINCT] coluna|expresso [alias],...}
FROM tabela;
Simplificando, uma instruo SELECT deve incluir o seguinte:
Uma clusula SELECT, que especifica as colunas a serem exibidas
Uma clusula FROM, que identifica a tabela que contm as colunas listadas na clusula
SELECT
Na sintaxe:
SELECT uma lista de uma ou mais colunas
* Seleciona todas as colunas
DISTINCT Suprime duplicatas
coluna|expresso Seleciona a coluna nomeada ou a expresso
alias Atribui ttulos diferentes s colunas selecionadas
FROM tabela Especifica a tabela que contm as colunas
.
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 6
Observao: Neste curso, as palavras palavra-chave, clusula e instruo so usadas da
seguinte maneira:
Uma palavra-chave refere-se a um elemento SQL individual, por exemplo, SELECT e
FROM so palavras-chave.
Uma clusula parte de uma instruo SQL, por exemplo, SELECT employee_id,
last_name etc.
Uma instruo uma combinao de duas ou mais clusulas, por exemplo, SELECT *
FROM employees
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 7
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Limitando as Linhas a Serem Selecionadas
Restrinja as linhas a serem retornadas usando a clusula
WHERE:
A clusula WHERE acompanha a clusula FROM.
SELECT *|{[DISTINCT] coluna|expresso [alias],...}
FROM tabela
[WHERE condio(es)];
Restrinja as linhas a serem retornadas pela consulta usando a clusula WHERE. Uma clusula
WHERE contm uma condio que deve ser atendida e segue diretamente a clusula FROM.
Se essa condio for verdadeira, a linha que acompanha a condio ser retornada.
Na sintaxe:
WHERE Restringe a consulta das linhas que atendem uma condio
condio composta por nomes de coluna, expresses,
constantes e um operador de comparao. Uma condio
especifica uma combinao de uma ou mais expresses e
operadores lgicos (Boolianos), e retorna o valor TRUE, FALSE
ou UNKNOWN.
A clusula WHERE pode comparar valores em colunas, literais, expresses aritmticas ou
funes. Ela composta por trs elementos:
Nome da coluna
Condio da comparao
Nome da coluna, constante ou lista de valores
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 8
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Usando a Clusula ORDER BY
Classifique as linhas recuperadas com a clusula ORDER BY:
ASC: Ordem crescente, padro
DESC: Ordem decrescente
A clusula ORDER BY aparece por ltimo na instruo
SELECT:
SELECT last_name, job_id, department_id, hire_date
FROM employees
ORDER BY hire_date ;

A ordem das linhas retornadas em um resultado de consulta indefinida. A clusula ORDER


BY pode ser usada para classificar as linhas. No entanto, se voc usar a clusula ORDER BY,
ela dever ser a ltima clusula da instruo SQL. Alm disso, possvel especificar uma
expresso, um alias ou uma posio de coluna como condio de classificao.
Sintaxe
SELECT expr
FROM tabela
[WHERE condio(es)]
[ORDER BY {coluna, expr, posio_numrica} [ASC|DESC]];
Na sintaxe:
ORDER BY especifica a ordem em que as linhas recuperadas sero exibidas
ASC organiza as linhas em ordem crescente (essa a ordem padro.)
DESC organiza as linhas em ordem decrescente
Se a clusula ORDER BY no for usada, a ordem de classificao ser indefinida, e o servidor
Oracle possivelmente no extrair linhas na mesma ordem para a mesma consulta duas
vezes. Use a clusula ORDER BY para exibir as linhas em uma ordem especfica.
Observao: Use as palavras-chave NULLS FIRST ou NULLS LAST para especificar se as
linhas retornadas que contm valores nulos aparecero primeiro ou por ltimo na sequncia
de ordenao.
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 9
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Sintaxe da InstruoINSERT
Adicione novas linhas a uma tabela usando a instruo
INSERT:
Com essa sintaxe, somente uma linha inserida por vez.
INSERT INTO tabela [(coluna [, coluna...])]
VALUES (valor [, valor...]);
Adicione novas linhas a uma tabela emitindo a instruo INSERT.
Na sintaxe:
tabela o nome da tabela
coluna o nome da coluna na tabela a ser preenchida
valor o valor correspondente da coluna
Observao: Essa instruo com a clusula VALUES adiciona somente uma linha por vez a
uma tabela.
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 10
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Sintaxe da Instruo UPDATE
Modifique os valores existentes em uma tabela com a
instruo UPDATE:
Atualize mais de uma linha por vez (se necessrio).
UPDATE tabela
SET coluna = valor [, coluna = valor, ...]
[WHERE condio];
Modifique os valores existentes em uma tabela usando a instruo UPDATE.
Na sintaxe:
tabela o nome da tabela
coluna o nome da coluna na tabela a ser preenchida
valor o valor ou a subconsulta correspondente da coluna
condio Identifica as linhas a serem atualizadas, e composta por nomes de
coluna, expresses, constantes, subconsultas e operadores de
comparao
Confirme a operao de atualizao consultando a tabela para exibir as linhas atualizadas.
Observao: Em geral, use a coluna de chave primria na clusula WHERE para identificar
uma nica linha para atualizao. O uso de outras colunas pode fazer com que vrias linhas
sejam atualizadas inesperadamente. Por exemplo, a identificao de uma nica linha na
tabela EMPLOYEES por nome perigosa, porque mais de um funcionrio pode ter o mesmo
nome.
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 11
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Instruo DELETE
Remova as linhas de uma tabela usando a instruo DELETE:
DELETE [FROM] tabela
[WHERE condio];
Sintaxe da Instruo DELETE
Remova as linhas de uma tabela usando a instruo DELETE.
Na sintaxe:
tabela o nome da tabela
Condio Identifica as linhas a serem deletadas, e composta por nomes de
coluna, expresses, constantes, subconsultas e operadores de
comparao
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 12
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Instruo CREATE TABLE
Voc deve ter:
O privilgio CREATE TABLE
Uma rea de armazenamento
Voc especifica:
O nome da tabela
O nome, o tipo de dados e o tamanho da coluna
CREATE TABLE [esquema.]tabela
(coluna tipodedados [DEFAULT expr][, ...]);
Crie tabelas para armazenar dados executando a instruo SQL CREATE TABLE. Essa uma
das instrues DDL que so subconjuntos das instrues SQL usadas para criar, modificar
ou remover estruturas do Banco de Dados Oracle. Essas instrues tm efeito imediato
sobre o banco de dados e tambm registram informaes no dicionrio de dados.
Para criar uma tabela, um usurio deve ter o privilgio CREATE TABLE e uma rea de
armazenamento na qual os objetos sero criados. O DBA (administrador do banco de dados)
usa as instrues DCL (Data Control Language) para conceder privilgios aos usurios.
Na sintaxe:
esquema igual ao nome do proprietrio
tabela o nome da tabela
DEFAULT expr Especificar um valor padro se um valor for omitido na instruo
INSERT
coluna o nome da coluna
tipodedados o tipo de dados e o comprimento da coluna
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 13
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Definindo Restries
Sintaxe:
Sintaxe da restrio em nvel de coluna:
Sintaxe da restrio em nvel de tabela:
CREATE TABLE [esquema.]tabela
(coluna tipodedados [DEFAULT expr]
[restrio_da_coluna],
...
[restrio_da_tabela][,...]);
coluna,...
[CONSTRAINT nome_da_restrio] tipo_de_restrio
(coluna, ...),
coluna [CONSTRAINT nome_da_restrio] tipo_de_restrio,
O slide informa a sintaxe para definir restries ao criar uma tabela. possvel criar
restries no nvel da coluna ou da tabela. As restries definidas no nvel da coluna so
includas quando a coluna definida. As restries em nvel de tabela so definidas no fim da
definio da tabela e devem fazer referncia a uma ou mais colunas s quais a restrio
pertence em um conjunto de parnteses. Basicamente, a sintaxe que diferencia as duas;
do contrrio, uma restrio em nvel de coluna funcionalmente igual restrio em nvel de
tabela.
As restries NOT NULL devem ser definidas no nvel da coluna.
As restries que se aplicam a mais de uma coluna devem ser definidas no nvel da tabela.
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 14
Na sintaxe:
esquema igual ao nome do proprietrio
tabela o nome da tabela
DEFAULT expr Especifica um valor padro a ser usado se um valor for omitido
na instruo INSERT
coluna o nome da coluna
tipodedados o tipo de dados e o comprimento da coluna
restrio_da_coluna uma restrio de integridade como parte da definio da
coluna
restrio_da_tabela uma restrio de integridade como parte da definio da
tabela
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 15
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Definindo Restries
Exemplo de uma restrio em nvel de coluna:
Exemplo de uma restrio em nvel de tabela:
CREATE TABLE employees(
employee_id NUMBER(6)
CONSTRAINT emp_emp_id_pk PRIMARY KEY,
first_name VARCHAR2(20),
...);
CREATE TABLE employees(
employee_id NUMBER(6),
first_name VARCHAR2(20),
...
job_id VARCHAR2(10) NOT NULL,
CONSTRAINT emp_emp_id_pk
PRIMARY KEY (EMPLOYEE_ID));
1
2
As restries geralmente so criadas junto com a tabela. Elas podem ser adicionadas a uma
tabela aps sua criao e tambm ser desativadas temporariamente.
Os dois exemplos no slide criam uma restrio de chave primria na coluna EMPLOYEE_ID
da tabela EMPLOYEES.
1. O primeiro exemplo usa a sintaxe em nvel de coluna para definir a restrio.
2. O secundo exemplo usa a sintaxe em nvel de tabela para definir a restrio.
Sero fornecidos mais detalhes sobre a restrio de chave primria posteriormente nesta
lio.
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 16
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Incluindo Restries
As restries impem regras no nvel de tabela.
As restries impediro a deleo de uma tabela
se houver dependncias.
Os seguintes tipos de restrio so vlidos:
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
Restries
O servidor Oracle usa as restries para impedir a entrada de dados invlida em tabelas.
Use as restries para:
Impor regras nos dados de uma tabela sempre que uma linha for inserida, atualizada ou
deletada nessa tabela. A restrio deve ser atendida para que a operao seja bem-
sucedida.
Impedir a deleo de uma tabela caso haja dependncias em outras tabelas.
Fornecer regras para ferramentas Oracle, como o Oracle Developer.
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Restries de Integridade dos Dados
Programao Java SE 7 A - 17
Restries Descrio
NOT NULL Especifica que a coluna no pode conter valor nulo
UNIQUE Especifica uma coluna ou combinao de colunas cujos valores
devem ser exclusivos para todas as linhas da tabela
PRIMARY KEY Identifica de forma exclusiva cada linha da tabela
FOREIGN KEY Estabelece e impe uma integridade referencial entre a coluna
e uma coluna da tabela referenciada de forma que os valores de
uma tabela correspondam aos da outra
CHECK Especifica uma condio que deve ser verdadeira

O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 18
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Tipos de Dados
Dados binrios brutos RAW e LONG RAW
Dados binrios (at 4 GB) BLOB
Dados binrios armazenados em um arquivo externo
(at 4 GB)
BFILE
Valores de data e hora
DATE
Dados de caractere de tamanho varivel (at 2 GB)
LONG
Dados de caractere (at 4 GB)
CLOB
Um sistema de nmeros de base 64 representando o
endereo exclusivo de uma linha na respectiva tabela
ROWID
Dados de caractere de tamanho fixo
CHAR(size)
Dados numricos de tamanho varivel NUMBER(p,e)
Dados de caractere de tamanho varivel
VARCHAR2(size)
Descrio Tipo de Dados
Tipos de Dados
Ao identificar uma coluna em uma tabela, necessrio fornecer um tipo de dados para a
coluna. H vrios tipos de dados disponveis:
Tipo de Dados Descrio
VARCHAR2(size)

Dados de caractere de tamanho varivel ( necessrio
especificar um tamanho mximo: o tamanho mnimo 1; e o
tamanho mximo 4.000)
CHAR [(size)] Dados de caractere de tamanho fixo em bytes (o tamanho
padro e mnimo 1; o tamanho mximo 2.000)
NUMBER [(p,s)] Nmero com preciso p e escala e (a preciso o nmero total
de dgitos decimais, e a escala o nmero de dgitos direita do
ponto decimal; a preciso pode variar de 1 a 38, e a escala pode
variar de &ndash;84 a 127)
DATE Valores de data e hora at o segundo mais prximo entre 1 de
janeiro de 4712 a.C. e 31 de dezembro de 9999 d.C.
LONG Dados de caractere de tamanho varivel (at 2 GB)
CLOB Dados de caractere (at 4 GB)


O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 19
Tipo de Dados Descrio
RAW(size) Dados binrios brutos de tamanho ( necessrio especificar o tamanho
mximo: 2.000)
LONG RAW Dados binrios brutos de tamanho varivel (at 2 GB)
BLOB Dados binrios (at 4 GB)
BFILE Dados binrios armazenados em um arquivo externo (at 4 GB)
ROWID Um sistema de nmeros de base 64 representando o endereo exclusivo de
uma linha na respectiva tabela


Diretrizes
Uma coluna LONG no copiada quando uma tabela criada usando uma subconsulta.
Uma coluna LONG no pode ser includa em uma clusula GROUP BY ou ORDER BY.
Somente uma coluna LONG pode ser usada por tabela.
Nenhuma restrio poder ser definida em uma coluna LONG.
Talvez seja necessrio usar uma coluna CLOB, em vez de uma coluna LONG.
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 20
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Eliminando uma Tabela
Move uma tabela para a lixeira
Remove a tabela e todas os seus dados se a clusula
PURGE for especificada
Invalida objetos dependentes e remove privilgios de
objeto na tabela
DROP TABLE dept80;
A instruo DROP TABLE move uma tabela para a lixeira ou remove a tabela e todos os seus
dados do banco de dados. A menos que a clusula PURGE seja especificada, a instruo
DROP TABLE no resultar na liberao de espao no tablespace para uso de outros objetos,
e o espao continuar sendo contabilizado na cota de espao do usurio. A eliminao de
uma tabela invalida os objetos dependentes e remove os privilgios do objeto na tabela.
Quando voc elimina uma tabela, o banco de dados perde todos os dados na tabela e todos
os ndices associados
a ela.
Sintaxe
DROP TABLE tabela [PURGE]
Na sintaxe, tabela o nome da tabela.
Diretrizes
Todos os dados so deletados da tabela.
Quaisquer views e sinnimos permanecem, mas so considerados invlidos.
Todas as transaes pendentes so confirmadas.
Somente o criador da tabela ou um usurio com o privilgio DROP ANY TABLE pode
remover uma tabela.
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
Programao Java SE 7 A - 21
Copyright 2012, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Resumo
Nesta lio, voc aprendeu a:
Descrever a sintaxe dos comandos SQL-92/1999 bsicos:
SELECT
INSERT
UPDATE
DELETE
CREATE TABLE
DROP TABLE
Definir os tipos de dados SQL-92/1999 bsicos
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D
O
r
a
c
l
e

U
n
i
v
e
r
s
i
t
y

a
n
d

E
r
r
o
r

:

Y
o
u

a
r
e

n
o
t

a

V
a
l
i
d

P
a
r
t
n
e
r

u
s
e

o
n
l
y
T
H
E
S
E

e
K
I
T

M
A
T
E
R
I
A
L
S

A
R
E

F
O
R

Y
O
U
R

U
S
E

I
N

T
H
I
S

C
L
A
S
S
R
O
O
M

O
N
L
Y
.


C
O
P
Y
I
N
G

e
K
I
T

M
A
T
E
R
I
A
L
S

F
R
O
M

T
H
I
S

C
O
M
P
U
T
E
R

I
S

S
T
R
I
C
T
L
Y

P
R
O
H
I
B
I
T
E
D