124 votes

Octet[] vers InputStream ou OutputStream

J'ai une colonne blob dans ma table de base de données, pour laquelle je dois utiliser byte[] dans mon programme Java comme un mapping et pour utiliser ces données, je dois les convertir en InputStream ou OutputStream . Mais je ne sais pas ce qui se passe en interne lorsque je le fais. Quelqu'un peut-il m'expliquer brièvement ce qui se passe lorsque je fais cette conversion ?

193voto

Stephen C Points 255558

Vous créez et utilisez les flux d'E/S des tableaux d'octets comme suit :

byte[] source = ...;
ByteArrayInputStream bis = new ByteArrayInputStream(source);
// read bytes from bis ...

ByteArrayOutputStream bos = new ByteArrayOutputStream();
// write bytes to bos ...
byte[] sink = bos.toByteArray();

En supposant que vous utilisez un pilote JDBC qui met en œuvre la norme Interface JDBC Blob (tous ne le font pas), vous pouvez également connecter un InputStream ou OutputStream à un blob en utilisant le getBinaryStream y setBinaryStream méthodes 1 et vous pouvez également obtenir et définir les octets directement.

(En général, vous devez prendre les mesures appropriées pour traiter toutes les exceptions, et fermer les flux. Cependant, la fermeture bis y bos dans l'exemple ci-dessus est inutile, puisqu'ils ne sont pas associés à des ressources externes (descripteurs de fichiers, sockets, connexions à des bases de données, etc.)

1 - Le setBinaryStream est en fait un getter. Allez comprendre.

12voto

pstanton Points 8807

Je suppose que vous voulez dire que "utiliser" signifie lire, mais ce que je vais expliquer pour le cas de la lecture peut être fondamentalement inversé pour le cas de l'écriture.

Vous vous retrouvez donc avec un byte[]. Celui-ci peut représenter n'importe quel type de données qui peuvent nécessiter des conversions spéciales (caractères, cryptés, etc).

Tout d'abord, vous pourriez créer un Flux d'entrée ByteArrayInputStream qui est essentiellement un mécanisme pour fournir les octets à quelque chose en séquence.

vous pourriez alors créer un FileOutputStream pour le fichier que vous voulez créer. Il existe de nombreux types d'InputStreams et d'OutputStreams pour différentes sources et destinations de données.

Enfin, vous écrivez l'InputStream dans l'OutputStream. Dans ce cas, le tableau d'octets est envoyé en séquence au FileOutputStream pour être écrit. Pour cela, je recommande d'utiliser IOUtils

byte[] bytes = ...;//
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
FileOutputStream out = new FileOutputStream(new File(...));
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);

et en sens inverse

FileInputStream in = new FileInputStream(new File(...));
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
byte[] bytes = out.toByteArray();

Si vous utilisez les extraits de code ci-dessus, vous devrez gérer les exceptions et je vous recommande de faire les "fermetures" dans un bloc final.

5voto

12cram Points 59

Nous pouvons convertir un tableau de byte[] en flux d'entrée en utilisant ByteArrayInputStream

String str = "Welcome to awesome Java World";
    byte[] content = str.getBytes();
    int size = content.length;
    InputStream is = null;
    byte[] b = new byte[size];
    is = new ByteArrayInputStream(content);

Pour un exemple complet, veuillez cliquer ici http://www.onlinecodegeek.com/2015/09/how-to-convert-byte-into-inputstream.html

4voto

Thilo Points 108673

Il n'y a pas de conversion entre InputStream/OutputStream et les octets avec lesquels ils travaillent. Ils sont conçus pour les données binaires et lisent (ou écrivent) les octets un par un, tels quels.

Une conversion doit avoir lieu lorsque vous souhaitez passer d'un octet à un caractère. Vous devez alors effectuer la conversion en utilisant un jeu de caractères. Cela se produit lorsque vous créez une chaîne ou un lecteur à partir d'octets, qui sont conçus pour des données de type caractère.

1voto

DALDEI Points 829
output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X