Artigo Java Magazine 10 - New I/O

Artigo publicado pela Java Magazine.

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).

 

" [...] continue lendo...

Artigos relacionados