7
votes

créer une arrayliste d'octets

Je veux lire les octets d'un fichier d'ondes dans un tableau. Étant donné que le nombre d'octets lis dépend de la taille du fichier d'ondes, je crée un tableau d'octets avec une taille maximale de 1000000. Mais cela entraîne des valeurs vides à la fin de la matrice. Donc, je voulais créer une matrice en augmentation dynamique et j'ai constaté que l'arraylist est la solution. Mais la fonction Lecture () de la classe AudioInputtream lit uniquement des octets uniquement dans un tableau d'octets! Comment puis-je transmettre les valeurs dans une arrayliste à la place?


1 commentaires

Quelles sont les prochaines étapes que vous voulez faire avec cet article d'octet? Peut-être que vous n'avez même pas besoin de ce grand tampon temporaire.


3 Réponses :


17
votes

Vous pouvez avoir un tableau d'octets comme: xxx

pour le reconvertir aux tableaux xxx

(Ensuite, vous aurez écrire un convertisseur pour transformer octet [] sur octet [] ).

EDIT: Vous utilisez Liste mal, je vais vous montrer comment lire audioinputtream simplement avec byteArrayOutPutStream . xxx

PS un ioexception est lancé si cadresize n'est pas égal à 1 . Par conséquent, utilisez un tampon d'octet pour lire des données, comme: xxx


6 commentaires

*****. Java: 41: Impossible de trouver le symbole de symbole: méthode Lecture (java.util.list ) emplacement: classe javax.sound.sampled.audioinputtream ais.dread (tampon);


Cela ne compile pas: il n'y a pas de manière automatique / intégrée pour convertir une liste sur un octet [] . En dehors de cela, en utilisant une liste est terriblement Inefficace d'espace.


@ Joachim Sauer, tu as raison, j'ai oublié qu'il doit y avoir une conversion de octet à octet. Réponse modificative.


Je suppose que j'ai un nouveau problème maintenant. Il dit que "ne peut pas lire un octet unique si la taille du cadre est plus d'un octet". J'ai utilisé GetFramesize () de la classe Audioformat et cela revient '4'. Je suppose donc que cela signifie que la taille actuelle du cadre est de quatre octets.


Je n'ai pas eu cette erreur auparavant parce que j'ai lu tous les octets à la fois dans le tableau. Pas un à un en utilisant la boucle tandis que


@Duay Kanth, vous avez raison, si des images ne sont pas égales à 1, il jette un ioException . Mise à jour ....



31
votes

ArrayList n'est pas la solution, BYTEARRAYOutPutStream est la solution. Créer un byteAreArrayOutPutStream Écrivez vos octets dessus, puis invoquer TobyeArray () pour obtenir les octets.

Exemple de ce que votre code devrait ressembler à: xxx


1 commentaires

Ceci est de loin le meilleur et en fait la seule réponse réellement correcte qui ne lit pas d'octets un par un, mais pour une raison quelconque, il montre au bas de la page pour moi ...



4
votes

Quelque chose comme ça devrait faire: xxx

désolé si le code est un peu faux. Je n'ai pas fait Java pendant un moment.

En outre, soyez prudent si vous le mettez en œuvre comme un moment (vrai) boucle :)

modifier: et voici une autre façon de Le faisant qui lit plus d'octets chaque fois: xxx

Notez que les méthodes de lecture () jettent une ioexception - la manipulation de cela est laissée comme un exercice pour le lecteur!


4 commentaires

Il ne devrait pas utiliser une liste de octet et lecture d'octet par octet est très lente.


Il veut une liste plutôt qu'un tableau. En outre, j'ai fourni un autre exemple de lecture en morceaux.


Il veut une liste car il ne connaît pas la taille en haut. C'est la solution correcte, même s'il n'utilise pas une liste .


Il voulait une liste parce qu'il ne connaissait pas de meilleures solutions. Il voulait avoir un octet [] à la fin et ne se souciait pas des étapes intermédiaires.