Quand utiliser le tableau d’octets et quand le tampon d’octets?

Quelle est la différence entre un tableau d’octets et un tampon d’octets?
Aussi, dans quelles situations faut-il être préféré à l’autre?

[mon fichier utilisateur est destiné à une application Web développée en Java].

Il existe plusieurs façons de travailler avec des octets. Et je suis d’accord que ce n’est pas toujours facile de choisir le meilleur:

  • l’ byte[]
  • le java.nio.ByteBuffer
  • le java.io.ByteArrayOutputStream (en combinaison avec d’autres stream)
  • le java.util.BitSet

L’ byte[] est juste un tableau primitif, contenant juste les données brutes. Ainsi, il ne dispose pas de méthodes pratiques pour créer ou manipuler le contenu.

Un ByteBuffer ressemble plus à un constructeur. Il est utilisé pour créer un byte[] . Contrairement aux tableaux, il contient des méthodes d’aide plus pratiques. (par exemple, la méthode append(byte) ).

Vous pourriez être tenté de dire qu’un ByteBuffer fait à byte[] , ce que fait un SsortingngBuilder pour Ssortingng . Mais il existe une différence / une lacune spécifique de la classe ByteBuffer . Tout comme avec les tableaux, le ByteBuffer a une taille fixe. Ainsi, lorsque vous l’instanciez, vous devez déjà spécifier la taille du tampon.

C’est l’une des raisons pour lesquelles je préfère souvent utiliser ByteArrayOutputStream car il se redimensionne automatiquement, comme le fait ArrayList . (Il a une méthode toByteArray() ). Parfois, il est pratique de l’envelopper dans un DataOutputStream . L’avantage est que vous aurez des appels de commodité supplémentaires (par exemple, writeShort(int) si vous devez écrire 2 octets).

BitSet est pratique lorsque vous souhaitez effectuer des opérations au niveau des bits. Vous pouvez obtenir / définir des bits individuels, et il a des méthodes d’opérateur logique comme xor() . (La méthode toByteArray() n’a été introduite que dans java 7.)

Bien sûr, en fonction de vos besoins, vous pouvez les combiner tous pour construire votre byte[] .

ByteBuffer fait partie du nouveau package IO (nio) développé pour un débit rapide de données basées sur des fichiers. Spécifiquement, Apache est un serveur Web très rapide (écrit en C) car il lit les octets du disque et les place directement sur le réseau, sans les mélanger à travers différents tampons. Cela se fait par le biais de fichiers mappés en mémoire, que les premières versions de Java n’avaient pas. Avec l’arrivée de nio, il est devenu possible d’écrire un serveur Web en Java aussi rapide qu’Apache. Lorsque vous voulez un débit de fichier à réseau très rapide, vous devez utiliser des fichiers mappés en mémoire et ByteBuffer.

Les bases de données utilisent généralement des fichiers mappés en mémoire, mais ce type d’utilisation est rarement efficace en Java. En C / C ++, il est possible de charger une grande partie de la mémoire et de la convertir en données saisies. En raison du modèle de sécurité de Java, cela n’est généralement pas possible, car vous ne pouvez convertir que certains types natifs, et ces conversions ne sont pas très efficaces. ByteBuffer fonctionne mieux lorsque vous traitez uniquement des octets en tant que données d’octets simples – une fois que vous devez les convertir en objects, les autres classes java io fonctionnent généralement mieux et sont plus faciles à utiliser.

Si vous ne traitez pas de fichiers mappés en mémoire, vous n’avez pas vraiment besoin de vous préoccuper de ByteBuffer – vous utiliseriez normalement des tableaux d’octets. Si vous essayez de créer un serveur Web, avec le débit le plus rapide possible de données d’octets brutes basées sur des fichiers, ByteBuffer (en particulier MappedByteBuffer) est votre meilleur ami.