我们如何阅读或使用outputstream的内容。 就我而言,我使用的是签名方法。
public static OutputStream decryptAsStream(InputStream inputStream, String encryptionKey)
此方法返回OutputStream。我想让OutputStream成为String。 是否可以将java.io.OutputStream的输出传递给Java中的String?
答案 0 :(得分:7)
我们如何阅读或使用outputstream的内容。
一般情况下你不能。 OutputStream
是您将字节写入的对象。通用API不提供任何获取字节的方法。
有一些特定类型的输出流可以让你返回字节。例如:
ByteArrayOutputStream
有一个获取字节数组内容的方法。PipeOutputStream
有一个您可以阅读的相应PipeInputStream
。FileOutputStream
写入文件,则通常打开FileInputStream
以读取文件内容...前提是您知道文件路径名。< / LI>
看一下这个方法,让我觉得方法签名错误就是你要做的。如果目的是为流提供加密器,则该方法应返回InputStream
。如果目的是将加密数据写在某处,则该方法应返回void
并获取该方法应写入的OutputStream
的额外参数。 (然后调用者可以使用OutputStream
子类来捕获加密数据......如果这是所需的。)
另一种“工作”的替代方法是更改方法的签名以生成返回类型ByteArrayOutputStream
(或文件名)。但这不是一个好的解决方案,因为它会影响调用者决定加密输出应该发送到何处的能力。
<强>更新强>
关于您的解决方案
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”发送。
答案 1 :(得分:5)
您可以执行以下操作:
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();
}
};
答案 2 :(得分:0)
如果您从response
获得了OutputStream
,则可以将OutputStream
的内容写入响应,并将其发送回浏览器。示例代码:
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();
阅读本文:Content-Disposition:What are the differences between “inline” and “attachment”?
在您的情况下,方法定义是:
public static OutputStream decryptAsStream(InputStream inputStream,
String encryptionKey)
因此,您可以从该方法获取OutputStream
:
OutputStream os = ClassName.decryptAsStream(inputStream,encryptionKey);
然后使用os
。
答案 3 :(得分:0)
主要是你可以使用outputstreams
发送文件内容为@The New Idiot提到的。 .pdf文件,zip文件,图像文件等。
在这种情况下,获取servlet的输出流并写入contentes
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();