web-dev-qa-db-fra.com

Quelle est l'utilisation de ByteBuffer en Java?

Quels sont les exemples d'applications pour ByteBuffer en Java? Veuillez énumérer tous les exemples de scénarios dans lesquels cela est utilisé. Je vous remercie!

175
Aklin

This est une bonne description de ses utilisations et de ses inconvénients. Vous l'utilisez essentiellement chaque fois que vous devez effectuer des E/S rapides de bas niveau. Si vous vouliez implémenter un protocole TCP/IP ou si vous écriviez une base de données (SGBD), cette classe serait pratique.

122
kelloti

La classe ByteBuffer est importante car elle constitue une base pour l’utilisation des canaux en Java. ByteBuffer La classe définit six catégories d'opérations sur les tampons d'octets, comme indiqué dans la documentation Java 7 :

  • Méthodes absolues et relatives get et put qui lisent et écrivent des octets simples;

  • Relative bulk get méthodes qui transfèrent des séquences d'octets contiguës de ce tampon dans un tableau;

  • Relative bulk put méthodes qui transfèrent des séquences d'octets contiguës d'un tableau d'octets ou d'un autre tampon d'octets dans ce tampon;

  • Méthodes get et put absolues et relatives qui lisent et écrivent les valeurs d'autres types primitifs, les traduisant en et à partir de séquences d'octets dans un ordre d'octets particulier;

  • Méthodes de création de tampons de vue, qui permettent de visualiser un tampon d'octets en tant que tampon contenant des valeurs d'un autre type primitif; et

  • Méthodes pour compactage , duplication , et découpage un tampon d'octets.

Example code : Putting Bytes into a buffer.

    // Create an empty ByteBuffer with a 10 byte capacity
    ByteBuffer bbuf = ByteBuffer.allocate(10);

    // Get the buffer's capacity
    int capacity = bbuf.capacity(); // 10

    // Use the absolute put(int, byte).
    // This method does not affect the position.
    bbuf.put(0, (byte)0xFF); // position=0

    // Set the position
    bbuf.position(5);

    // Use the relative put(byte)
    bbuf.put((byte)0xFF);

    // Get the new position
    int pos = bbuf.position(); // 6

    // Get remaining byte count
    int rem = bbuf.remaining(); // 4

    // Set the limit
    bbuf.limit(7); // remaining=1

    // This convenience method sets the position to 0
    bbuf.rewind(); // remaining=7
89
ykombinator

Java IO à l'aide d'API orientées flux est exécuté à l'aide d'un tampon en tant que stockage temporaire de données dans l'espace utilisateur. Les données lues à partir du disque par DMA sont d'abord copiées dans les tampons de l'espace noyau, puis transférées dans un tampon de l'espace utilisateur. Il y a donc des frais généraux. L'éviter peut permettre un gain de performance considérable.

Nous pourrions ignorer ce tampon temporaire dans l’espace utilisateur, s’il existait un moyen d’accéder directement au tampon dans l’espace noyau. Java NIO fournit un moyen de le faire.

ByteBuffer figure parmi plusieurs tampons fournis par Java NIO. C'est juste un conteneur ou un réservoir de stockage pour lire ou écrire des données. Le comportement ci-dessus est obtenu en allouant un tampon direct à l'aide de allocateDirect() API on Buffer.

La documentation Java de Byte Buffer contient des informations utiles.

19
deepujain

Dans Android, vous pouvez créer un tampon partagé entre C++ et Java (avec la méthode directAlloc) et le manipuler des deux côtés.

13
someUser

Here est un excellent article expliquant les avantages de ByteBuffer. Voici les points clés de l'article:

  • Le premier avantage d’un ByteBuffer, qu’il soit direct ou indirect, est accès aléatoire efficace de données binaires structurées (par exemple, de bas niveau IO, comme indiqué dans l’une des réponses). Avant Java 1.4, pour lire de telles données, il était possible d'utiliser un DataInputStream, mais sans accès aléatoire.

Vous trouverez ci-dessous les avantages spécifiques à ByteBuffer/MappedByteBuffer direct. Notez que les tampons directs sont créés en dehors du tas:

  1. Non affecté par les cycles gc: Les tampons directs ne seront pas déplacés pendant les cycles de récupération de place car ils résident en dehors du tas. La technologie de mise en cache BigMemory de TerraCota semble s'appuyer fortement sur cet avantage. S'ils étaient sur le tas, cela ralentirait les temps de pause de gc.

  2. Augmentation des performances: Dans le flux IO, les appels en lecture impliqueraient des appels système, qui nécessitent un changement de contexte entre le mode utilisateur et le mode noyau et inversement, ce qui serait coûteux, en particulier si le fichier est consulté en permanence. Cependant, avec le mappage en mémoire, cette commutation de contexte est réduite car il est plus probable que les données se trouvent en mémoire (MappedByteBuffer). Si les données sont disponibles en mémoire, elles sont accessibles directement sans invoquer le système d’exploitation, c’est-à-dire sans commutation de contexte.

Notez que les MappedByteBuffers sont très utiles, en particulier si les fichiers sont volumineux et que peu de groupes de blocs sont consultés plus fréquemment.

  1. Partage de page: Les fichiers mappés en mémoire peuvent être partagés entre les processus car ils sont alloués dans l'espace mémoire virtuel du processus et peuvent être partagés entre les processus.
12
Dheeru Mundluru