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? P>
merci, p>
6 Réponses :
Non, l'accès à la matrice interne n'est pas fourni sauf par la méthode TobyTeArray (), qui en fait une copie. P>
Où avez-vous trouvé TobyeArray code> dans byteArrayInputStream code>?
TobyeArray () n'existe qu'en byteArrayOutPutStream
Il confondu ByteArrayOutPutStream avec ByTeArrayInputStream.
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). P>
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.
EXTENDRE Cependant, vous pouvez trouver le motif de décorateur plus serviable. P> byteArrayInputStream code>, alors vous avez accès aux champs protégé code>. C'est la façon de le faire. Des constructeurs sont fournis pour prendre le tableau d'octets d'un argument. P>
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;
}
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 code>, 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 code> code> 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.
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);
Avec la bibliothèque Apache Commons IO ( http://commons.apache.org/io/) Vous pouvez utiliser l'entrée EDIT: OK, je n'ai pas compris la question ... pas de copie ...
Peut-être quelque chose comme: p> vous permettra de conserver une référence au tampon utilisé par le flux d'entrée p> p> ioutils.tobytearray (java.io.inputtream entrée) code>
C'est ioutils (capitale u, je crois)