Java Language Utilisation de base - Utilisation de DirectByteBuffer


Exemple

DirectByteBuffer est une implémentation spéciale de ByteBuffer qui ne comporte aucun byte[] dessous.

Nous pouvons allouer un tel ByteBuffer en appelant:

ByteBuffer directBuffer = ByteBuffer.allocateDirect(16);

Cette opération allouera 16 octets de mémoire. Le contenu des tampons directs peut résider en dehors du tas normal récupéré.

Nous pouvons vérifier si ByteBuffer est direct en appelant:

directBuffer.isDirect(); // true

Les principales caractéristiques de DirectByteBuffer sont que JVM essaiera de travailler en mode natif sur la mémoire allouée sans mise en mémoire tampon supplémentaire, de sorte que les opérations effectuées sur celui-ci peuvent être plus rapides que celles effectuées sur ByteBuffer avec des tableaux situés en dessous.

Il est recommandé d'utiliser DirectByteBuffer avec des opérations d'E / S lourdes reposant sur la vitesse d'exécution, comme la communication en temps réel.

Nous devons être conscients que si nous essayons d'utiliser la méthode array() , nous obtiendrons une UnsupportedOperationException . Il est donc recommandé de vérifier si notre ByteBuffer l’a (tableau d’octets) avant d’essayer d’y accéder:

 byte[] arrayOfBytes;
 if(buffer.hasArray()) {
     arrayOfBytes = buffer.array();
 }

Une autre utilisation du tampon d'octet direct est l'interopérabilité via JNI. Comme un tampon d'octet direct n'utilise pas d' byte[] , mais un bloc de mémoire réel, il est possible d'accéder à cette mémoire directement via un pointeur en code natif. Cela permet d’économiser un peu de temps et d’encombrement lors de la répartition entre Java et la représentation native des données.

L'interface JNI définit plusieurs fonctions pour gérer les tampons d'octets directs: Support NIO .