Les classes étendues de Buffer ne disposent pas de constructeurs. Ainsi, une instance s'obtient par l'intermédiaire des méthodes d'allocation statiques allocate().

CharBuffer cb = CharBuffer.allocate(2048);

Les sous-classes de Buffer peuvent être créées également par enveloppement (wrapping) d'un tableau de données comprenant des données d'un type primitif.

int[] entiers = new int[1024];
//Enveloppement complet du tableau
IntBuffer tampon1 = IntBuffer.wrap(entiers);
//Enveloppement partiel du tableau, 
//du 512éme élément jusqu'au 544éme.
IntBuffer tampon2 = IntBuffer.wrap(entiers, 512, 32);

Seule la classe ByteBuffer possède une seconde méthode d'allocation particulière allocateDirect(). Un objet ByteBuffer direct améliore les performances des opérations d'entrée/sortie. D'ailleurs, la méthode isDirect() permet de se renseigner à propos du type du tampon (direct : true; indirect : false).

ByteBuffer bb = ByteBuffer.allocateDirect(2048);

La différence de performances entre les objets ByteBuffer directs ou indirects réside dans le fait que les premiers sont créés à partir d'un code natif via JNI (Java Native Interface). L'amélioration des performances des tampons directs dépend donc de leur implémentation au sein la plateforme Java sous-jacente. D'autre part, une exception non-spécifiée peut être levée si un tampon direct fait référence à une région inaccessible de la mémoire.

Par ailleurs, un tampon en lecture seule peut s'obtenir au moyen de la méthode abstraite asReadOnlyBuffer().

ByteBuffer bbr = bb.asReadOnlyBuffer();

Un tampon en lecture seule est très pratique dans le cas où il est nécessaire de protéger des données contre toutes tentatives de modifications impromptues.

Enfin, la classe abstraite Buffer propose une méthode abstraite isReadOnly(), qui est destinée à fournir une indication quant à la caractéristique d'accès en lecture seule du tampon. Cette méthode retourne une valeur booléenne (lecture seule : true; lecture/écriture : false). Une exception ReadOnlyBufferException sera lancée dans le cas ou une tentative de modification d'un tampon paramétré en lecture seule.

Exemple [voir]
package nio;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class Copie {
    public static void main(String args[]) {
        File source = new File("source.txt");
        File destination = new File("destination.txt");

        Copie copie = new Copie();
        copie.copier(source, destination, true);
    }
    public void copier(File fic_source, File fic_destination, boolean rapide) {
        try {
          FileInputStream fis_source = 
                    new FileInputStream(fic_source);
          FileOutputStream fos_destination = 
                    new FileOutputStream(fic_destination);
  
          FileChannel fc_source = fis_source.getChannel();
          FileChannel fc_destination = fos_destination.getChannel();
  
          ByteBuffer tampon = null;
          if(rapide)
              tampon = ByteBuffer.allocateDirect(1024);
          else
              tampon = ByteBuffer.allocate(1024);
  
          int nb_octets = 0;
          while ((nb_octets = fc_source.read(tampon)) > -1) {
              tampon.flip();
  
              fc_destination.write(tampon);
  
              tampon.clear();
          }
        }
        catch(IOException e) {
            e.printStackTrace();
        }
    }
}