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 unByte
, unbyte[]
NE devient PAS automatiquement enByte[]
!
(également vrai pour les autres primitives)
Donc vous avez deux choix:
byte
dans byte[]
et d’ add
individuellement byte[]
en Byte[]
Arrays.asList
et addAll
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)));
int[]
en List
en Java? Arrays.asList()
ne fonctionne pas comme il se doit? 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();