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 ?
Réponses
Trop de publicités?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.
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.
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
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.
- Réponses précédentes
- Plus de réponses