我们如何阅读或使用outputstream的内容.
就我而言,我正在使用一种具有签名的方法.
public static OutputStream decryptAsStream(InputStream inputStream,
String encryptionKey)
此方法返回OutputStream.我想让OutputStream成为String.
是否可以将java.io.OutputStream的输出传递给Java中的String?
解决方法:
How can we read or use the contents of outputstream.
一般来说,你不能. OutputStream是您将字节写入的对象.通用API不提供任何获取字节的方法.
有一些特定类型的输出流可以让你返回字节.例如:
> ByteArrayOutputStream有一个获取字节数组内容的方法.
> PipeOutputStream具有您可以读取的相应PipeInputStream.
>如果使用FileOutputStream写入文件,通常可以打开FileInputStream来读取文件内容…前提是您知道文件路径名.
看看那种方法,让我觉得方法签名对于你想要做的事情是错误的.如果目的是为流提供加密器,则该方法应返回InputStream.如果目的是在某处写入加密数据,那么该方法应该返回void并获取一个额外的参数,该参数是该方法应该写入的OutputStream. (然后调用者可以使用OutputStream子类来捕获加密数据……如果这是所需的.)
“工作”的另一个替代方法是更改方法的签名以生成返回类型ByteArrayOutputStream(或文件名).但这不是一个好的解决方案,因为它会影响调用者决定加密输出应该发送到何处的能力.
UPDATE
关于你的解决方案
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);
这可能有效,但代码很差:
>如果AESHelper.decryptAsStream是您编写的方法(看起来好像是!),那么您应该将其声明为返回ByteArrayOutputStream.
>如果它已被声明为返回ByteArrayOutputStream,则应将其直接分配给baos.
>无论哪种方式,您都不应该将baos初始化为新创建的ByteArrayOutputStream实例,该实例会立即被丢弃.
值得注意的是Content-Type不正确.如果您将该响应发送到浏览器,它将尝试将加密数据解释为图像…并失败.从理论上讲,您可以设置Content-Encoding标头……但是没有一个可以工作.所以最好的解决方案是将Content-Type作为“application / octet-stream”发送.
标签:java,servlets
来源: https://codeday.me/bug/20191008/1870394.html