Sie sind auf Seite 1von 20

TECNOLOGIA EM ANÁLISE E

DESENVOLVIMENTO DE SISTEMAS

PROGRAMAÇÃO
DE
OBJETOS
DISTRIBUÍDOS

Prof. Zanete
SUMÁRIO

1 INTRODUÇÃO
3
2 ARRAY DE BYTES
4
3 STREAM DE ENTRADA E SAÍDA
6
4 A CLASSE STRING
9
5 URL - UNIFORM RESOURCE LOCATOR
10
13
6 THREADS

16
7 SOCKETS

17
ANEXO I

20
BIBLIOGRAFIA

2
1 INTRODUÇÃO

Nos últimos anos a complexidade, o consumo elétrico e o aquecimento das


CPUs tornaram-se autênticas barreiras ao aumento da performance dos processadores,
historicamente reconhecível pelo aumento da sua freqüência de funcionamento, medida
em MHz ou GHz.
Devido a essas barreiras, os estudos sobre o aumento da potência dos
computadores está cada vez mais se concentrando no uso de múltiplos processadores
do que no aumento do clock propriamente dito.
Se um computador tem capacidade de multiprocessamento mas os programas
que ele utiliza foram escritos para serem executados seqüencialmente, não será
possível tirar proveito dessa capacidade.
Se um programa puder ser fracionado em múltiplas linhas de execução
independentes, um computador com múltiplos processadores poderá executá-las ao
mesmo tempo, uma em cada processador. A esse tipo de programação, damos o nome
de programação concorrente. Se um programa concorrente puder ser fracionado e
instalado em partes, em computadores independentes interligados por uma rede,
dizemos que este é um programa distribuído.
Objetos distribuídos formam a base para a construção de aplicações distribuídas.
Uma aplicação distribuída é um programa distribuído que foi projetado para tirar
proveito do fato de estar executando em várias máquinas geograficamente separadas
para benefício do usuário.

3
2 ARRAY DE BYTES

A CLASSE FILE
A classe File oferece abstração para informações sobre arquivos, como por
exemplo, caminho, data e tamanho do arquivo em um sistema de arquivos.

import java.io.*;
public class existeArquivo {
public static void main(String args[])
{
File f = new File(args[0]);
if (f.exists())
{
System.out.print("O arquivo " + args[0] + " existe");
System.out.println(" e possui " + f.length() + " bytes");
}
else
{
System.out.println("O arquivo nao existe");
}
}
}

ARRAY DE BYTES

Arrays de bytes são declarados para armazenar uma certa quantidade de bytes.
Cada byte representa um inteiro de 0 a 255 de acordo com a tabela ASCII. Veja o
ANEXO I.

Para declarar um array de bytes usamos o seguinte comando:


byte[] pedaco = new byte[10];

Neste exemplo foi criado um array de bytes nomeado como pedaco. O array
possui 10 posições, e portanto pode armazenar no máximo 10 bytes.

Agora, suponha o preenchimento do array com a palavra tecnologia. Nesse caso,


cada caracter será armazenado em uma posição do vetor, iniciando da posição 0 até a
posição 9. No entanto, como cada byte representa um inteiro de 0 a 255, teremos 10
inteiros armazenados no vetor, onde cada inteiro representa o código ASCII
correspondente a cada caracter da palavra tecnologia.

4
O exemplo abaixo apresenta na tela todos os bytes do vetor:

for (int i=0;i<10;i++)


{
System.out.print(pedaco[i]);
}

A saída será: 116 101 99 110 111 108 111 103 105 97
Neste outro exemplo a saída de bytes foi convertida para caracteres:

for (int i=0;i<10;i++)


{
System.out.print((char)pedaco[i]);
}

A saída será: t e c n o l o g i a
Neste outro exemplo o todo o array de bytes é convertido para String de uma só
vez:

System.out.println(new String(pedaco));

A saída será: t e c n o l o g i a

Há ainda uma forma direta de declarar e iniciar os valores de um array, por


exemplo:
// Na linha abaixo foi declarado e iniciado o array pedaco do tipo byte
// com 10 elementos.
byte[] pedaco = {116,101,99,110,111,108,111,103,105,97};
for (int i=0;i<10;i++)
{
System.out.print((char)pedaco[i]);
}

A saída será: t e c n o l o g i a

5
3 STREAM DE ENTRADA E SAÍDA

Uma Stream de E/S (Entrada e Saída) gera o caminho pelo qual seus programas
podem enviar uma seqüência de bytes de uma fonte até um destino. Uma Stream de
entrada é uma fonte ou produtor de bytes, e uma Stream de saída é um destino ou
consumidor de bytes.
Uma fonte e um destino de dados de um programa pode ser o disco, o teclado, o
mouse, a memória, o monitor, uma conexão de rede etc.

Figura 3.1 – Leitura de uma fonte.

Figura 3.2 – Escrita em um destino

O pacote Java.io.* contém a coleção de classes Stream que suportam os


algoritmos de leitura e escrita.
As hierarquias de classes Stream são divididas em 2 categorias:

Figura 3.3 – Hierarquia de classes Stream

6
STREAM DE BYTES

Para ler o conteúdo de um arquivo utilizamos a classe FileInputStream.


Primeiramente temos que abrir uma Stream de entrada para o arquivo e depois aplicar
o método read dessa classe. O método read retorna a quantidade de bytes lidos ou o
valor –1 se for o final da Stream.
Podemos utilizar a classe FileInputStream para realizar a leitura de qualquer tipo
de arquivo, tanto arquivos binários, quanto arquivos executáveis, arquivos de textos etc.
Para realizar as operações de escrita no sistema de arquivos, ou seja, criar arquivos
em disco e gravar o seu conteúdo de bytes, podemos utilizar os objetos da classe
FileOutputStream. A escrita em pedaços reflete no tamanho do arquivo, pois se o último
pedaço lido, ocupar menos bytes do que o definido no array de bytes, a diferença não
será eliminada do conteúdo do arquivo, podendo gerar lixo.
Como uma Stream de bytes representa um fluxo de bytes qualquer, o tratamento
posterior à leitura depende do formato. Por exemplo, o programa seguinte lê uma
imagem JPG e exibe em um frame. Nesse caso a Stream de bytes deve ser tratada
apropriadamente como JPEG.

1 import java.awt.*;
2 import com.sun.image.codec.jpeg.*;
3 import java.io.*;
4
5 public class ShowImage extends Frame
6 {
7 public static void main(String[] args)
8 {
9 ShowImage f = new ShowImage();
10 f.setTitle("teste JPG");
11 f.setSize(500, 500);
12 f.setVisible(true);
13 }
14 public void paint(Graphics g)
15 {
16 try
17 {
18 FileInputStream is = new FileInputStream("BannerProj.jpg");
19 JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(is);
20 Image image = decoder.decodeAsBufferedImage();
21 g.drawImage(image, 0, 0, this);
22 }
23 catch(IOException e) {}
24 }
25 }

7
A JPEGImageDecoder irá decodificar uma InputStream que contém dados de
imagem JPEG e retornará uma imagem JPG buferizada.
Esses passos são realizados nas linhas 19 e 20 do exemplo acima. Na linha 19 cria-se
o objeto decoder e na linha 20 aplica-se o método decodeAsBufferedImage que irá
retornar um objeto Image pronto para ser desenhado. A linha 21 desenha a imagem no
frame através do método drawImage(image, 0, 0, this); onde o parâmetro image
representa o próprio objeto imagem e os parâmetros 0, 0, representa as posições de
coluna e linha em pixels onde a imagem será exibida dentro do frame. O parâmetro this
representa o objeto frame (Observer) no qual a imagem será exibida (pois a classe
ShowImage é um Frame). Por não tratar eventos, a janela deste programa não será
fechada, para encerrar a execução pressione Ctrl-C no prompt de comando.

STREAM DE CARACTERES
As classes FileWriter e PrintWriter permitem gravar arquivos textos.
A tabela abaixo apresenta alguns caracteres especiais que podem ser usados na
geração de arquivos textos:

Caracteres Especiais
\n Pula linha (newline ou linefeed)
\r Retorno de carro (carriage return)
\b Retrocesso (backspace)
\t Tabulação (horizontal tabulation)
\f Nova página (formfeed)
\’ Apóstrofe
\” Aspas
\\ Barra invertida

Para ler arquivos textos poemos utilizar as classes FileReader e BufferedReader.

8
4 A CLASSE STRING

A Classe String possui uma série de métodos para manipular strings. É possível
através dos métodos dessa classe obter informações como, o tamanho de uma
determinada string (em nº de caracteres), se a string começa ou termina com
determinada seqüência de caracteres, se ao longo de sua extensão existe determinado
caracter e enfim várias outras possibilidades.
Dentre os vários métodos existente nessa classe os mais usados são:

Valor de Nome do método Função


retorno
boolean endsWith(“str”) Verifica se a string termina com “str”
boolean startsWith(“str”) Verifica se a string inicia com “str”
int indexOf(',') Indica a posição da primeira ocorrencia do caracter vírgula
int lastIndexOf('/') Indica a posição da ultima ocorrencia do caracter barra
int length() Indica o tamanho da string
String replace('*','$') Troca o caracter asterisco pelo caracter dolar
String toLowerCase Converte todos os caracteres da String para minúsculo
String toUpperCase Converte todos os caracteres da String para maiúsculo
String substring(ini,fim) Obtem uma parte da string indicada pela posicao inicial e final.

Obs. A classe String nada te haver com Strems de Caracteres.

9
5 URL - UNIFORM RESOURCE LOCATOR

Se você já navegou pela Web, provavelmente já usou URL's para ter acesso
páginas Web.
Talvez seja mais fácil, embora não completamente preciso, pensar em um URL
como o nome de um arquivo na World Wide Web porque a maioria dos URLs se refere
a um arquivo em alguma máquina na rede. Porém, lembre-se que URL também pode
apontar outros recursos na rede, como consultas de banco de dados e saída de dados.

Definição: URL é uma sigla para Uniform Resource Locator - Localizador de


Recurso Uniforme e é uma referência (um endereço) para um recurso na Internet. Um
recurso pode ser um arquivo, ou qualquer coisa que possa ser identificado por um URL
(Um registro em um bando de dados na web).

A seguir apresenta-se um exemplo de URL para o site da Sun Microsystems.

Figura 6.1 – Componentes do URL


Como no diagrama acima, um URL tem dois componentes principais:
• Identificador de protocolo
• Nome do recurso
Nota que o identificador de protocolo e o nome do recurso está separado por “:”.
O identificador de protocolo indica o nome do protocolo ser usado para ir buscar
o recurso. O exemplo usa o Hypertext Transfer Protocol (HTTP) que é usado para
servir documentos tipicamente de hipertexto. HTTP é apenas um de muitos protocolos
para acessar diferentes recursos na rede. Outros protocolos incluem File Transfer
Protocol (FTP), File e outros.

10
O nome de recurso é o endereço completo ao recurso. O formato do nome de
recurso depende completamente do protocolo usado, mas para muitos protocolos,
inclusive HTTP, o nome de recurso contém um ou mais dos componentes listados na
tabela seguinte:

Host Name Nome da máquina que contém o recurso.


Filename O caminho e nome do arquivo na máquina.
Port Number Número da porta de conexão (opcional).
Reference Uma referência para uma âncora nomeada dentro de um recurso e que
normalmente identifica um local específico dentro de um arquivo (opcional).

Para muitos protocolos, são requeridos o nome do host e o nome do arquivo


enquanto o número da porta e referência são opcionais. Por exemplo, o nome de
recurso para um URL de HTTP tem que especificar um servidor na rede (Host Name) e
o caminho para o documento naquela máquina (Filename); também pode especificar
um número de porta e uma referência. No URL para o site Java “java.sun.com” é o
nome do host e o “/index.htm” é o arquivo html hospedado no host.

CRIANDO UM URL

O modo mais fácil para criar um objeto de URL é através de uma String que
representa a forma legível do endereço de URL. Esta é tipicamente a forma que as
pessoas usam para um URL. Por exemplo, o URL para o site da Faccar leva a seguinte
forma: http://www.faccar.com.br
Em seu programa Java, você pode usar uma String que contém este texto para
criar um objeto URL:

URL faccar = new URL("http://www.faccar.com.br");

Cada construtor de URL lança uma exceção “MalformedURLException” se os


parâmetros estiverem errados. Se você quer tratar essa exceção pode embutir o
construtor de URL dentro de um bloco try/catch.

11
EXAMINANDO UM URL

A classe de URL provê vários métodos que examinam objetos de URL. Você
pode obter o protocolo, o nome do host, número da porta, e nome do arquivo de um
URL usando os seguintes métodos de acesso:

getProtocol Retorna o componente do URL que identifica o protocolo


getHost Retorna o componente do URL que identifica o nome do host
getPort Retorna um número inteiro que identifica o número da porta. Se o número da porta
não foi especificado no URL o método getPort retorna –1
getFile Retorna o nome do Arquivo do componente URL
getRef Retorna o componente do URL que identifica a referência

O exemplo apresenta o uso destes métodos:

import java.net.*;
public class AnaliseURL
{
public static void main(String args[])
{
try
{
String faccar = "http://www.faccar.com.br:8080/zanete/oop.htm#introducao";
URL aURL = new URL(faccar);
System.out.println("protocolo = " + aURL.getProtocol());
System.out.println("nome da maquina = " + aURL.getHost());
System.out.println("nome do arquivo = " + aURL.getFile());
System.out.println("porta = " + aURL.getPort());
System.out.println("referencia = " + aURL.getRef());
} catch (MalformedURLException e) {}
}
}
Exemplo 9 – Uso de métodos URL

O resultado possível desse exemplo é apresentado como segue:

protocolo = http
nome da maquina = www.faccar.com.br
nome do arquivo = /zanete/oop.htm
porta = 8080
referencia = introducao

LENDO DIRETAMENTE DE UM URL


Depois que você criou um URL você pode chamar o método openStream do
URL() para obter um fluxo de entrada e ler o conteúdo do URL. O método
openStream() retorna um objeto do tipo InputStream.

12
6 THREADS

Threads são fluxos de execução que rodam dentro de um processo (aplicação).


Normalmente os threads compartilham regiões de memória, mas não necessariamente.
A diferença entre processos e threads é que processos permitem que o seu sistema
operacional execute mais de uma aplicação ao mesmo tempo enquanto que threads
permitem que sua aplicação execute mais de um método ao mesmo tempo.
Todos os programas que fizemos até agora só tinham um único fluxo de
execução. Nenhum deles executava duas coisas (dois pedaços de código)
simultaneamente. Grande parte do software de qualidade escrito hoje faz uso de mais
de um fluxo de execução, mais de um thread. São os programas chamados
multithreaded.
O seu browser de hipertexto consegue fazer o download de vários arquivos ao
mesmo tempo, gerenciando as diferentes velocidades de cada servidor e ainda assim
permite que você continue interagindo, mudando de página no hipertexto enquanto o
arquivo nem foi carregado totalmente. Isto não seria possível sem o uso de threads.
Se sua máquina possui só um processador, esse paralelismo é um falso
paralelismo. O processador tem seu tempo dividido em pequenos intervalos, em cada
intervalo ele executa uma das atividades e você tem a sensação de que tudo está
funcionando ao mesmo tempo, simultaneamente. Se sua máquina têm mais de um
processador, então seu ambiente será capaz de mapear seus threads em hardware e
você terá realmente processamento paralelo. Um thread por si só não é um programa,
entretanto ele roda dentro de um programa.

Um thread é um fluxo de execução dentro de um programa.

13
Um programa Multithreaded.

Existem duas maneiras básicas de criar threads em Java: usando interfaces e


usando herança.
Usando herança, sua classe já é um thread, que quando tiver seu método start()
chamado vai executar tudo o que estiver no método run() em paralelo.
Para criar threads usando interfaces, você só tem que dizer que implementa a
interface Runnable, que é composta do método run(). Quando um Thread é construído
usando como argumento uma classe que implementa a interface Runnable, chamar o
método start para esta thread faz com que o método run() de nossa classe comece a
ser executado em paralelo nesta thread.

SINCRONIZANDO O ACESSO A RECURSOS COMPARTILHADOS

A linguagem de programação Java apresenta um mecanismo inspirado nos


monitores. Quando uma thread executa um método sincronizado, o Java garante que
ela poderá concluir antes que outra thread execute qualquer método sincronizado no
mesmo objeto. Quando uma thread chama o método M1 e depois outra thread também
chama o mesmo método M1, a segunda thread não pode continuar. Em vez disso, ela
é desativada e deve esperar que a primeira thread termine de executar o método M1.
Quando você cria um objeto com um ou mais métodos sincronizados, Java
prepara uma fila com todas as threads esperando para executar o método. Isso é
mostrado na figura abaixo. Sempre que uma thread completar seu trabalho com o
objeto, ela cederá a vez á thread de maior prioridade na fila de espera.

14
Exercício:
Criar um programa Contador.java utilizando o modificador synchronized.
public synchronized void run()
O resultado esperado é que o método run() seja utilizado com exclusividade por
uma das threads e só depois ao término da primeira execução, dar-se-a uma chance
para a outra thread.

15
7 SOCKETS

Sockets são estruturas que permitem que funções de software se interconectem.


O termo é usado para especificar uma estrutura que faz com que rotinas de software
na mesma máquina ou em máquinas diferentes possam se comunicar.
No caso de software para internet, um socket é constituído por um endereço IP e
um número de porta. O endereço IP identifica a máquina e a porta identifica o processo
que está rodando. Numa máquina pode haver vários processos rodando, cada um em
uma porta.
No java os sockets estão disponíveis através do pacote java.net. As classes
principais deste pacote são:
ServerSocket – usada no servidor para esperar conexão com os clientes.
Socket – usada no cliente e no servidor para trocar mensagens.
A figura abaixo apresenta como criar uma aplicação cliente/servidor usando
Socket e ServerSocket respectivamente.

Figura 8.1 – Aplicação Socket/ServerSocket

16
ANEXO I
TABELA ASCII
ASCII (acrônimo para American Standard Code for Information Interchange) é um
conjunto de códigos para o computador representar números, letras, pontuação e
outros caracteres.
ASCII é uma padronização da indústria de computadores, onde cada caracter é
manipulado na memória discos etc, sob forma de código binário. O código ASCII é
formado por todas as combinações possíveis de 7 bits, sendo que existem várias
extensões que abrangem 8 ou mais bits.

CARACTERES NORMAIS
Binário Decimal Hex Gráfico Binário Decimal Hex Gráfico
00100000 32 20 (vazio) (␠ ) 01010000 80 50 P
00100001 33 21 ! 01010001 81 51 Q
00100010 34 22 " 01010010 82 52 R
00100011 35 23 # 01010011 83 53 S
00100100 36 24 $ 01010100 84 54 T
00100101 37 25 % 01010101 85 55 U
00100110 38 26 & 01010110 86 56 V
00100111 39 27 ' 01010111 87 57 W
00101000 40 28 ( 01011000 88 58 X
00101001 41 29 ) 01011001 89 59 Y
00101010 42 2A * 01011010 90 5A Z
00101011 43 2B + 01011011 91 5B [[[]]
00101100 44 2C , 01011100 92 5C \
00101101 45 2D - 01011101 93 5D [[]]]
00101110 46 2E . 01011110 94 5E ^
00101111 47 2F / 01011111 95 5F [[_]]
00110000 48 30 0 01100000 96 60 `
00110001 49 31 1 01100001 97 61 a
00110010 50 32 2 01100010 98 62 b
00110011 51 33 3 01100011 99 63 c
00110100 52 34 4 01100100 100 64 d
00110101 53 35 5 01100101 101 65 e
00110110 54 36 6 01100110 102 66 f
00110111 55 37 7 01100111 103 67 g
00111000 56 38 8 01101000 104 68 h
00111001 57 39 9 01101001 105 69 i
00111010 58 3A : 01101010 106 6A j

17
Binário Decimal Hex Gráfico Binário Decimal Hex Gráfico
00111011 59 3B ; 01101011 107 6B k
00111100 60 3C [[<]] 01101100 108 6C l
00111101 61 3D = 01101101 109 6D m
00111110 62 3E [[>]] 01101110 110 6E n
00111111 63 3F ? 01101111 111 6F o
01000000 64 40 @ 01110000 112 70 p
01000001 65 41 A 01110001 113 71 q
01000010 66 42 B 01110010 114 72 r
01000011 67 43 C 01110011 115 73 s
01000100 68 44 D 01110100 116 74 t
01000101 69 45 E 01110101 117 75 u
01000110 70 46 F 01110110 118 76 v
01000111 71 47 G 01110111 119 77 w
01001000 72 48 H 01111000 120 78 x
01001001 73 49 I 01111001 121 79 y
01001010 74 4A J 01111010 122 7A z
01001011 75 4B K 01111011 123 7B [[{]]
01001100 76 4C L 01111100 124 7C |
01001101 77 4D M 01111101 125 7D [[}]]
01001110 78 4E N 01111110 126 7E ~
01001111 79 4F O 01111111 127 7F Delete

CARACTERES DE CONTROLE
Os caracteres de controle tiveram sua origem nos primórdios da computação,
quando se usavam máquinas de escrever eletro-mecânicas, fitas de papel perfurado e
impressoras de cilindro (drum printers), portanto muitos deles são dirigidos a este
equipamento.
Binário Decimal Hex Ctrl Sigla Controle Gráfico
00000000 00 00 ^@ Null Null - Nulo
00000001 01 01 ^A SOH Start of Header - Início do cabeçalho 
00000010 02 02 ^B STX Start of Text - Início do texto 
00000011 03 03 ^C ETX End of Text - Fim do texto 
00000100 04 04 ^D EOT End of Tape - Fim de fita 
00000101 05 05 ^E ENQ Enquire - Interroga identidade do terminal 
00000110 06 06 ^F ACK Acknowledge - Reconhecimento 
00000111 07 07 ^G BEL Bell - Campainha •
00001000 08 08 ^H BS Back-space - Espaço atrás 
00001001 09 09 ^I HT Horizontal Tabulation - Tabulação horizontal 
00001010 10 0A ^J LF Line-Feed - Alimenta linha 
00001011 11 0B ^K VT Vertical Tabulation - Tabulação vertical 
00001100 12 0C ^L FF Form-Feed - Alimenta formulário 
00001101 13 0D ^M CR Carriage-Return - Retorno do carro 

18
Binário Decimal Hex Ctrl Sigla Controle Gráfico
00001110 14 0E ^N SO Shift-Out - Saída do shift (passa a usar caracteres de baixo da tecla - 
minúsculas, etc.)
00001111 15 0F ^O SI Shift-In - Entrada no shift (passa a usar caracteres de cima da tecla: 
maiúsculas, caracteres especiais, etc.)
00010000 16 10 ^P DLE Data-Link Escape 
00010001 17 11 ^Q DC1 Device-Control 1
00010010 18 12 ^R DC2 Device-Control 2

00010011 19 13 ^S DC3 Device-Control 3 


00010100 20 14 ^T DC4 Device-Control 4 ¶
00010101 21 15 ^U NAK Neg-Acknowledge - Não-reconhecimento §
00010110 22 16 ^V SYN Synchronous Idle
00010111 23 17 ^W ETB End-of-Transmission Block

00011000 24 18 ^X CAN Cancel


00011001 25 19 ^Y EM End-Of-Medium
00011010 26 1A ^Z SUB Substitute
00011011 27 1B ^[ ESC Escape 
00011100 28 1C ^\ FS File Separator
00011101 29 1D ^] GS Group Separator 
00011110 30 1E ^^ RS Record Separator 
00011111 31 1F ^_ US Unit Separator 

19
BIBLIOGRAFIA
[CES 1996] CESTA, Augusto. Tutorial: A linguagem de programação Java. [1996]. DCC
Unicamp: Campinas. Disponível em:
http://www.ic.unicamp.br/~cmrubira/aacesta/java/javatut.html
Acesso em: 22 fev. 2010.

[DEI 2003] DEITEL, H. M. Java, como programar. 4. ed. - Porto Alegre: Bookman, 2003.

[FUR 2002] FURGERI, Sérgio. JAVA 2: Ensino didático. Desenvolvendo e implementando


aplicações. São Paulo: Érica, 2002.

[LEM 2003] LEMAY, Laura. Aprenda em 21 dias Java: Professional reference. Rio de Janeiro:
Campus, 2003.

[RIC 2001] RICARTE, Ivan Luiz Marques. Programação orientada a objetos: Uma abordagem
com Java. Campinas: FEEC/UNICAMP, 2001. (Apostila)

[SUN 2003] SUN MICROSYSTEMS. The Java Tutorial - The Really Big Index. [November 3,
2003]. Disponível em: http://java.sun.com/docs/books/tutorial/reallybigindex.html
Acesso em: 22 fev. 2010.

[SUN 2009] SUN MICROSYSTEMS. JavaTM 2 Platform, Standard Edition 6, API Specification.
[December 18, 2009]. Disponível em: http://java.sun.com/javase/6/docs/api/
Acesso em: 22 fev. 2010.

20

Das könnte Ihnen auch gefallen