Esse artigo faz parte da revista Java Magazine edição 10. Clique aqui para ler todos os artigos desta edição

 

 

Atenção: por essa edição ser muito antiga não há arquivo PDF para download.Os artigos dessa edição estão disponíveis somente através do formato HTML. 

 

Pente fino

New I/O Fundamental

Parte 1: Buffers e Channels

Nessa série será analisada a API New I/O, que acrescenta muitas funcionalidades e traz ganhos expressivos de desempenho em operações de entrada e saída

                                             

O tratamento de entrada e saída (I/O, Input/Output) é um recurso essencial em qualquer linguagem ou ambiente de programação. Sempre esteve presente em Java, através da API java.io. Esta API, no entanto, foi concebida visando à portabilidade e construída com um alto nível de abstração, deixando de lado muitas das técnicas avançadas de I/O. Além de não oferecer suporte a técnicas fundamentais, como o acesso direto à memória nativa do SO e I/O não-bloqueante, a API clássica faz a leitura/escrita de dados, byte a byte, enquanto que os sistemas operacionais quase sempre trabalham com blocos de bytes. Isso penaliza aplicações que necessitam alto desempenho em operações de entrada e saída, como servidores que gerenciam muitas conexões simultâneas e aplicações científicas que manipulam grandes massas de dados.

Buscando solucionar esses problemas, foi lançado no início de 2000 o JSR-51 ("New I/O APIs for the Java Platform"), que resultou na inclusão, no J2SE 1.4, da API New I/O (NIO). A nova API não substitui, mas sim complementa a API clássica, incluindo recursos que colocam Java no mesmo time que linguagens como C e C++, tanto em performance quanto em funcionalidade – mas mantendo a tradicional característica multiplataforma das APIs Java.

Nesta primeira parte analisaremos os componentes básicos da nova API: buffers e channels.

Buffers: conceitos básicos

A classe java.nio.Buffer e suas subclasses são a base da nova API (veja a Figura 1). No NIO, a maioria das operações é realizada através da manipulação de buffers (o que reflete o comportamento dos sistemas operacionais). Um buffer é um "container de dados", um intermediário entre o sistema operacional (que realiza operações de I/O em bloco) e a aplicação (que geralmente faz a manipulação de bytes individualmente).

Buffers no NIO possuem três propriedades de estado essenciais:

·         capacity – número máximo de elementos que o buffer pode conter; uma vez criado um buffer, esta propriedade permanece constante;

·         position – índice do próximo elemento a ser lido ou escrito no buffer;

·         limit – índice do primeiro elemento que não deve ser lido ou escrito, ou seja, apenas podem ser lidos os elementos de 0 a limit-1.

Buffers fornecem, ainda, um mecanismo de "checkpoint". Chamando-se o método mark(), o valor de position é armazenado em sua propriedade mark; uma chamada a reset() altera position para o valor de mark.

As quatro propriedades de buffers obedecem às seguinte restrições:

0 <=  mark <= position <= limit <= capacity

 

A classe Buffer fornece apenas métodos para modificação (direta ou indireta) dessas propriedades (veja a Tabela 1). Métodos de transferência de dados, como get() e put(), são definidos nas suas subclasses. O quadro "Propriedades passo a passo" demonstra a manipulação das propriedades de buffers.

Nas seções a seguir, são detalhadas as operações básicas com buffers (os métodos usados nos exemplos são definidos nas subclasses de Buffer).

 

Figura 1. Hierarquia de buffers

Criação de buffers

Existem seis maneiras de criar um buffer:

Alocando diretamente. A alocação é feita através de um método estático (a classe CharBuffer, assim como as demais subclasses de Buffer, são abstratas):

 

CharBuffer buffer = CharBuffer.allocate(10);

 

Os elementos de um buffer são internamente armazenados em um array (backing array), do mesmo tipo primitivo do buffer, e os métodos hasArray() e array() podem ser usados para verificar se array é acessível e para recuperá-lo, respectivamente. No caso da alocação direta, o backing array será criado automaticamente.

...

Quer ler esse conteúdo completo? Tenha acesso completo