web-dev-qa-db-fra.com

Comment pouvons-nous lire ou utiliser le contenu de outputstream

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?

5
bajrangi

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.
  • Une PipeOutputStream a une PipeInputStream correspondante à partir de laquelle vous pouvez lire.
  • Si vous utilisez une 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".

7
Stephen C

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();
        }
    };
5
Ushani

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.

0
NINCOMPOOP

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();
0
UVM