我们如何读取或使用输出流的内容 [已关闭]
我们如何读取或使用输出流的内容。在我的情况下,我正在使用具有签名的方法。
公共静态输出流解密AsStream(InputStream inputStream, String EncryptionKey)
此方法返回输出流。我想让输出流到字符串。是否可以将 java.io.OutputStream 的输出通过管道传输到 Java 中的字符串?
我们如何读取或使用输出流的内容。在我的情况下,我正在使用具有签名的方法。
公共静态输出流解密AsStream(InputStream inputStream, String EncryptionKey)
此方法返回输出流。我想让输出流到字符串。是否可以将 java.io.OutputStream 的输出通过管道传输到 Java 中的字符串?
我们如何读取或使用输出流的内容。
一般来说,你不能。是将字节写入的对象。常规 API 不提供任何方法来取回字节。OutputStream
有特定类型的输出流可以让您取回字节。例如:
ByteArrayOutputStream
PipeOutputStream
PipeInputStream
FileOutputStream
FileInputStream
看看这种方法,我突然发现方法签名对于您尝试执行的操作是错误的。如果目的是为流提供加密器,则该方法应返回 .如果目的是在某个地方写入加密数据,则该方法应返回并采用一个额外的参数,该参数是该方法应写入的参数。(然后调用方可以使用子类来捕获加密的数据...如果这是想要的。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
如果已声明为返回 a,则应将其直接分配给 。ByteArrayOutputStream
baos
无论哪种方式,您都不应初始化为立即丢弃的新创建的实例。baos
ByteArrayOutputStream
还值得注意的是,内容类型不正确。如果您将该响应发送到浏览器,它将尝试将加密数据解释为图像...并失败。从理论上讲,您可以设置一个内容编码标头...但是没有一个会起作用。因此,最好的解决方案是将内容类型作为“应用程序/八位字节流”发送。
您可以执行如下操作:
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();
}
};