web-dev-qa-db-fra.com

Octet [] à 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 mappage et utiliser ces données, je dois les convertir en InputStream ou OutputStream. Mais je ne sais pas ce qui se passe en interne quand je le fais. Quelqu'un peut-il m'expliquer brièvement ce qui se passe lorsque je fais cette conversion?

123
GuruKulki

Vous créez et utilisez des flux d'E/S de tableau 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 implémente le standard interface JDBC Blob (tous ne le font pas), vous pouvez également vous connecter un InputStream ou OutputStream à un blob en utilisant les méthodes getBinaryStream et setBinaryStream1, et vous pouvez également obtenir et définir les octets directement.

(En général, vous devez prendre les mesures appropriées pour gérer les exceptions et fermer les flux. Toutefois, il est inutile de fermer bis et bos dans l'exemple ci-dessus, car ils ne sont associés à aucune ressource externe; par exemple, descripteurs de fichier, sockets, connexions à une base de données.)

1 - La méthode setBinaryStream est vraiment un getter. Allez comprendre.

190
Stephen C

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

alors vous vous retrouvez avec un octet []. cela pourrait représenter tout type de données pouvant nécessiter des types de conversions spéciaux (caractères, chiffrés, etc.). supposons que vous souhaitiez écrire ces données telles quelles dans un fichier.

tout d'abord, vous pouvez créer un ByteArrayInputStream , qui est fondamentalement un mécanisme pour fournir les octets à quelque chose en séquence.

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

enfin, vous écrivez InputStream dans OutputStream. dans ce cas, le tableau d'octets serait envoyé en séquence au FileOutputStream pour l'écriture. 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 procéder à la "fermeture" dans un bloc finally.

12
pstanton

nous pouvons convertir le tableau byte [] en flux d'entrée à l'aide de 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 vérifier ici http://www.onlinecodegeek.com/2015/09/how-to-convert-byte-into-inputstream.html

6
12cram

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

Une conversion doit avoir lieu lorsque vous souhaitez passer d'octet à caractère. Ensuite, vous devez convertir en utilisant un jeu de caractères. Cela se produit lorsque vous créez String ou Reader à partir d'octets, qui sont conçus pour les données de caractères.

4
Thilo
output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )
2
DALDEI

Je me rends bien compte que ma réponse est très tardive pour cette question mais je pense que la communauté souhaiterait ne nouvelle approche de cette question .

0
Sym-Sym
byte[] data = dbEntity.getBlobData();
response.getOutputStream().write();

Je pense que c'est mieux puisque vous avez déjà un OutputStream existant dans l'objet de réponse. pas besoin de créer un nouveau OutputStream.

0
Stas Wishnevetsky