Manière la plus concise d’insérer un tableau d’octets dans List ?

Dans certains codes, je crée une liste d’octets et je souhaite insérer un tableau d’octets dans la liste au fur et à mesure de sa construction. Quel est le moyen le plus propre de le faire? Voir le code ci-dessous – merci.

public class ListInsert { public static byte[] getData() { return new byte[]{0x01, 0x02, 0x03}; } public static void main(Ssortingng[] args) { final List list = new ArrayList(); list.add((byte)0xaa); list.add(getData()); // I want to insert an array of bytes into the list here list.add((byte)0x55); } } 

SI vous avez un Byte[] arr – un tableau de types de références – vous pouvez utiliser Arrays.asList(arr) pour obtenir une List .

SI vous avez un byte[] arr – un tableau de primitives – vous ne pouvez pas utiliser Arrays.asList(arr) pour obtenir une List . Au lieu de cela, vous obtiendrez une liste à un élément List .

C’est-à-dire qu’un byte peut être mis en boîte sur un Byte , un byte[] NE devient PAS automatiquement en Byte[] !
(également vrai pour les autres primitives)

Donc vous avez deux choix:

  • Il suffit de parcourir chaque byte dans byte[] et d’ add individuellement
  • Utiliser des bibliothèques
    • Avec Apache Commons Lang , vous pouvez convertir byte[] en Byte[]
      • Vous pouvez ensuite Arrays.asList et addAll
    • Avec Guava, vous pouvez convertir immédiatement byte[] en List

La première option ressemble à ceci:

 byte[] arr = ...; for (byte b : arr) { list.add(b); } 

La deuxième option avec Guava ressemble à ceci:

 // requires Guava byte[] arr = ...; list.addAll(Bytes.asList(arr)); 

Cela utilise Bytes.asList du package com.google.common.primitives . Le paquet contient également d’autres utilitaires de conversion pour d’autres primitives. Toute la bibliothèque est très utile.

Avec Apache Commons Lang, vous pouvez utiliser Byte[] toObject(byte[]) partir de ArrayUtils :

 // requires Apache Commons Lang byte[] arr = ...; list.addAll(Arrays.asList(ArrayUtils.toObject(arr))); 

Questions connexes

  • Comment convertir int[] en List en Java?
  • Arrays.asList() ne fonctionne pas comme il se doit?
  • Impact de l’autoboxing sur les performances
  • Bibliothèques Java tierces gratuites les plus utiles?

Cela pourrait ne pas répondre à votre question, mais cela devrait être une bonne pratique Si vous manipulez énormément un tableau d’octets, utilisez plutôt ByteBuffer. Cette classe propose de nombreux types d’implémentation qui peuvent vous donner les meilleures performances et la meilleure utilisation de la mémoire. L’un d’eux est le Direct ByteBuffer, que certaines opérations peuvent exécuter de manière native.

Mettre un octet ou un tableau d’octets est aussi simple que de manger un bonbon:

 ByteBuffer.put(byte src); ByteBuffer.put(byte[] src); ByteBuffer.put(byte[] src, int offset, int length); 

Et la meilleure chose à faire est d’essayer d’extraire les octets: directement, aucune copie de tableau n’est nécessaire (vous devez toutefois vérifier la taille) 🙂

 byte[] data = ByteBuffer.array(); 

J’espère que vous changez d’avis 🙂

Il y a la méthode Arrays.asList() qui fait exactement cela:

 Arrays.asList(getData()); 

Donc dans votre cas:

 list.addAll(Arrays.asList(getData())); 

Avez-vous vraiment besoin de List ? Je le pensais aussi, mais j’ai changé d’avis. ByteArrayOutputStream était beaucoup mieux pour moi.

 import java.io.ByteArrayOutputStream; ByteArrayOutputStream bo = new ByteArrayOutputStream(); // fill in buf or get a single byte b bo.write(buf, 0, bytesRead); bo.write(b); byte[] resultArray = bo.toByteArray();