web-dev-qa-db-fra.com

Convertir OutputStream en ByteArrayOutputStream

J'essaie de convertir un OutputStream en ByteArrayOutput Stream. Je n'ai pas pu trouver de réponses simples claires sur la façon de procéder. Cette question a été posée dans le titre de la question sur StackOverflow, mais le corps de la question demande comment changer un ByteArrayStream en OuputStream. J'ai un OutputStream qui est déjà créé et cet exemple donné dans la réponse ne se compilera pas!

Cette question est ici

J'ai un OutputStream qui est déjà construit et a une longueur de 44 octets appelée waveHeader. Je veux convertir cela en un ByteArrayOutputStream parce que je veux pouvoir le changer en un octet [] avec waveHeader.ToByteArray () pour plus de simplicité dans les processus ultérieurs;

Existe-t-il un type de casting simple ou quelque chose qui permettra cela?

Sinon alors:

  • Existe-t-il un moyen de construire un pointeur sur les données du OutputStream d'origine s'il n'est pas possible de le convertir?

  • Comment pourrait-on accéder aux données contenues dans OutputStream?

Je suis nouveau à Java. C'est juste un hobby pour moi. Streams en VisualBasic .net où beaucoup plus facile!

15
Bill Smith

Il existe plusieurs scénarios possibles:

a) Vous avez un ByteArrayOutputStream, mais il a été déclaré comme OutputStream. Ensuite, vous pouvez faire un casting comme celui-ci:

void doSomething(OutputStream os)
{
    // fails with ClassCastException if it is not a BOS
    ByteArrayOutputStream bos = (ByteArrayOutputStream)os;
...

b) si vous avez un autre type de flux de sortie, cela n'a pas vraiment de sens de le convertir en BOS. (Vous souhaitez généralement le caster, car vous souhaitez accéder au tableau de résultats). Dans ce cas, vous devez simplement configurer un nouveau flux et l'utiliser.

void doSomething(OutputStream os)
{
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bos.write(something);
    bos.close();
    byte[] arr = bos.toByteArray();
    // what do you want to do?
    os.write(arr); // or: bos.writeTo(os);
...

c) Si vous avez écrit quelque chose sur n'importe quel type de OutputStream (dont vous ne savez pas ce que c'est, par exemple parce que vous l'obtenez à partir d'une servlet), il n'y a aucun moyen de récupérer ces informations. Vous ne devez pas écrire quelque chose dont vous aurez besoin plus tard. Une solution est la réponse b) où vous l'écrivez dans votre propre flux, puis vous pouvez utiliser le tableau pour votre propre but ainsi que l'écrire dans le flux de sortie réel.

Gardez à l'esprit que ByteArrayOutputStreams conserve toutes les données en mémoire.

24
eckes

Vous pouvez utiliser la méthode writeTo de ByteArrayOutputStream.

ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] bytes = new bytes[8];
bos.write(bytes);
bos.writeTo(oos);

Vous pouvez créer une instance de ByteArrayOutputStream. Vous devez ensuite écrire les données dans cette instance ByteOutputStream, puis en utilisant la méthode writeTo, qui accepte un OutputStream, vous pouvez activer l'écriture de ByteArrayOutputStream la sortie, à l'instance de OutputStream que vous avez passée comme argument.

7
Rahul Bobhate