Comment pouvons-nous lire ou utiliser le contenu de outputstream. Dans mon cas, j'utilise une méthode avec signature.
public statique OutputStream decryptAsStream (InputStream inputStream, String encryptionKey)
Cette méthode renvoie OutputStream. Je veux obtenir OutputStream à String. Est-il possible de diriger la sortie d'un Java.io.OutputStream vers une chaîne en Java?
Comment pouvons-nous lire ou utiliser le contenu de outputstream.
En général, vous ne pouvez pas. Un OutputStream
est un objet pour lequel vous écrivez des octets. L'API générale ne fournit aucun moyen de récupérer les octets.
Il existe des types spécifiques de flux de sortie qui vous permettraient de récupérer les octets. Par exemple:
ByteArrayOutputStream
a une méthode pour obtenir le contenu du tableau d'octets.PipeOutputStream
a une PipeInputStream
correspondante à partir de laquelle vous pouvez lire.FileOutputStream
pour écrire dans un fichier, vous pouvez généralement ouvrir une FileInputStream
pour lire le contenu du fichier ... à condition de connaître le chemin du fichier.En regardant cette méthode, il me semble que la signature de la méthode est mauvaise pour ce que vous essayez de faire. Si le but est de fournir un chiffreur pour un flux, la méthode doit alors renvoyer une InputStream
. Si le but est d'écrire les données chiffrées quelque part , la méthode doit alors renvoyer void
et prendre un paramètre supplémentaire qui correspond à OutputStream
dans lequel la méthode doit écrire. (L'appelant peut ensuite utiliser une sous-classe OutputStream
pour capturer les données cryptées ... si c'est ce que vous souhaitez.)
Une autre alternative qui «fonctionnerait» consiste à modifier la signature de la méthode pour rendre le type de retour ByteArrayOutputStream
(ou un nom de fichier). Mais ce n'est pas une bonne solution car cela empêche le demandeur de décider à quel endroit la sortie cryptée doit être envoyée.
METTRE À JOUR
Concernant votre solution
OutputStream os = AESHelper.decryptAsStream(sourceFile, encryptionKey);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos = (ByteArrayOutputStream) os;
byte[] imageBytes = baos.toByteArray();
response.setContentType("image/jpeg");
response.setContentLength(imageBytes.length);
OutputStream outs = response.getOutputStream();
outs.write(imageBytes);
Cela pourrait fonctionner, mais c'est du code pauvre:
Si AESHelper.decryptAsStream
est une méthode que vous avez écrite (et cela ressemble!), Vous devez alors la déclarer comme renvoyant une ByteArrayOutputStream
.
S'il est déjà déclaré comme retournant une ByteArrayOutputStream
, vous devez l'affecter directement à baos
.
Dans les deux cas, vous ne devez PAS initialiser baos
à une instance ByteArrayOutputStream
nouvellement créée qui est immédiatement jetée.
Il est également intéressant de noter que le type de contenu est incorrect. Si vous envoyez cette réponse à un navigateur, celui-ci tente d'interpréter les données cryptées en tant qu'image ... et échoue. En théorie, vous pouvez définir un en-tête Content-Encoding ... mais aucun ne fonctionnera. La meilleure solution consiste donc à envoyer le type de contenu sous la forme "application/octet-stream".
Vous pouvez faire quelque chose comme suit:
OutputStream output = new OutputStream()
{
private StringBuilder string = new StringBuilder();
@Override
public void write(int x) throws IOException {
this.string.append((char) x );
}
public String toString(){
return this.string.toString();
}
};
Si vous obtenez la OutputStream
de la response
, vous pouvez écrire le contenu de la OutputStream
dans la réponse qui sera renvoyée au navigateur. Exemple de code:
OutputStream outStream = response.getOutputStream();
response..setHeader("Content-Disposition", "attachment; filename=datafile.xls");
response.setContentType("application/vnd.ms-Excel");
byte[] buf = new byte[4096];
int len = -1;
while ((len = inStream.read(buf)) != -1) {
outStream.write(buf, 0, len);
}
outStream.flush();
outStream.close();
Lisez ceci: Content-Disposition: Quelles sont les différences entre “en ligne” et “attachement”?
Dans votre cas, la définition de la méthode est la suivante:
public static OutputStream decryptAsStream(InputStream inputStream,
String encryptionKey)
Ainsi, vous pouvez obtenir la OutputStream
à partir de cette méthode sous la forme:
OutputStream os = ClassName.decryptAsStream(inputStream,encryptionKey);
Et utilisez ensuite la os
.
Vous pouvez principalement utiliser outputstreams
pour envoyer le contenu du fichier sous la forme @Le nouvel idiot mentionné. fichiers .pdf, fichiers zip, fichiers images, etc.
Dans de tels scénarios, récupérez le flux de sortie de votre servlet et écrivez le contenu.
OutputStream outStream = response.getOutputStream();
FileInputSteram fis = new FileInputStream(new File("abc.pdf));
byte[] buf = new byte[4096];
int len = -1;
while ((len = fis.read(buf)) != -1) {
outStream .write(buf, 0, len);
}
response.setContentType("application/octect");(if type is binary) else
response.setContentType("text/html");
outStream .flush();
outStream.close();