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
Buscando solucionar esses problemas, foi lançado no início de 2000 o JSR
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
Buffers fornecem, ainda, um mecanismo de "checkpoint". Chamando
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á
...