7
votes

Obtenez un tableau d'octet interne de byteArrayInputStream

Je veux obtenir le tableau d'octets interne de ByteArrayInputStream. Je ne veux pas étendre cette classe ou l'écrire dans un autre tableau d'octets. Y a-t-il une classe d'utilité qui m'aidait à faire ça?

merci,


0 commentaires

6 Réponses :


-3
votes

Non, l'accès à la matrice interne n'est pas fourni sauf par la méthode TobyTeArray (), qui en fait une copie.


3 commentaires

Où avez-vous trouvé TobyeArray dans byteArrayInputStream ?


TobyeArray () n'existe qu'en byteArrayOutPutStream


Il confondu ByteArrayOutPutStream avec ByTeArrayInputStream.



1
votes

non. L'extension de la classe est le seul moyen (bien, que et à l'aide de la réflexion pour contourner la visibilité sur le terrain, qui n'est absolument pas recommandée).


4 commentaires

Pourquoi vous ne recommandez pas de réflexion?


@Sean: Parce que c'est lent et est sujet à une erreur (et ne fonctionnerai pas du tout si le code est exécuté dans un bac à sable).


Pouvez-vous expliquer plus sur "c'est lent"? Courir dans un bac à sable, vous voulez dire avec des paramètres de sécurité?


@San: Accès aux champs La réflexion de throgh est au moins un ordre de grandeur plus lentement que de le faire directement. Et oui, vous devez utiliser SETPESSIBLE () pour accéder à un champ protégé par la réflexion et peut être interdit par un SecurityManager.



3
votes

EXTENDRE byteArrayInputStream , alors vous avez accès aux champs protégé . C'est la façon de le faire. Des constructeurs sont fournis pour prendre le tableau d'octets d'un argument.

Cependant, vous pouvez trouver le motif de décorateur plus serviable.


0 commentaires

23
votes

Vous ne pouvez pas avoir accès au même réseau d'octets, mais vous pouvez facilement copier le contenu du flux:

public byte[] read(ByteArrayInputStream bais) {
     byte[] array = new byte[bais.available()];
     bais.read(array);

     return array;
}


4 commentaires

Je ne veux pas faire ce bc, je ne veux pas avoir une autre copie de mon tableau d'octets.


Bien que ce code devrait fonctionner dans la pratique en raison de notre connaissance interne du fonctionnement de java.io.byeearrayinputtream , en théorie, il ne respecte pas le contrat d'introuvream, qui doit être correct - Vous devez vérifier la valeur de retour de la méthode pour détecter une lecture partielle.


Correct. Je ne fais que cela parce que je "sais" la méthode est adoptée par une byearrayInputStream.


Je ne veux pas créer une autre copie de mon tableau d'octets. Préoccupations de la mémoire ici.



0
votes

Le champ interne est protégé, il serait donc facile de s'étendre. Si vous vraiment em> Je ne veux pas, la réflexion peut être une autre solution. Ce n'est pas une excellente solution car elle s'appuie sur le fonctionnement interne de ByTearrayInputStream (tel que la connaissance du champ s'appelle buf code>). Vous avez été prévenu.

ByteArrayInputStream bis = ...
Field f = ByteArrayInputStream.class.getDeclaredField("buf");
f.setAccessible(true);
byte[] buf = (byte[])f.get(bis);


0 commentaires

4
votes

Avec la bibliothèque Apache Commons IO ( http://commons.apache.org/io/) Vous pouvez utiliser l'entrée ioutils.tobytearray (java.io.inputtream entrée)

EDIT: OK, je n'ai pas compris la question ... pas de copie ... Peut-être quelque chose comme: xxx

vous permettra de conserver une référence au tampon utilisé par le flux d'entrée


1 commentaires

C'est ioutils (capitale u, je crois)