我们如何读取或使用输出流的内容。就我而言,我使用的是具有签名的方法。
public static OutputStream decryptAsStream(InputStream inputStream, String encryptionKey)
此方法返回 OutputStream。我想将 OutputStream 转换为字符串。是否可以将 java.io.OutputStream 的输出通过管道传输到 Java 中的字符串?
我们如何读取或使用输出流的内容。
一般来说你不能。AnOutputStream
是您写入字节的对象。通用 API 不提供任何方法来取回字节。
有特定类型的输出流可以让您取回字节。例如:
ByteArrayOutputStream
有一个获取字节数组内容的方法。PipeOutputStream
有一个对应PipeInputStream
的,您可以从中读取。FileOutputStream
写入文件,则通常可以打开 aFileInputStream
来读取文件内容...前提是您知道文件路径名。看着那个方法,我觉得方法签名对于你想要做的事情是错误的。如果目的是为流提供加密器,则该方法应返回一个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
.
如果它已经被声明为返回 aByteArrayOutputStream
你应该将它直接分配给baos
.
无论哪种方式,您都不应该初始化一个立即被丢弃baos
的新创建的实例。ByteArrayOutputStream
还值得注意的是 Content-Type 不正确。如果您将该响应发送到浏览器,它会尝试将加密数据解释为图像......并且失败。从理论上讲,您可以设置一个 Content-Encoding 标头......但没有一个可以工作。所以最好的解决方案是将 Content-Type 作为“application/octet-stream”发送。
您可以执行以下操作:
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();
}
};
主要您可以使用outputstreams
@The New Idiot 提到的发送文件内容。.pdf 文件、zip 文件、图像文件等。
在这种情况下,获取 servlet 的输出流并写入内容
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();
如果您OutputStream
从 获得response
,您可以将 的内容写入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:“inline”和“attachment”有什么区别?
在您的情况下,方法定义是:
public static OutputStream decryptAsStream(InputStream inputStream,
String encryptionKey)
因此,您可以OutputStream
从该方法中获取:
OutputStream os = ClassName.decryptAsStream(inputStream,encryptionKey);
然后使用os
.