13

我们如何读取或使用输出流的内容。就我而言,我使用的是具有签名的方法。

public static OutputStream decryptAsStream(InputStream inputStream, String encryptionKey)

此方法返回 OutputStream。我想将 OutputStream 转换为字符串。是否可以将 java.io.OutputStream 的输出通过管道传输到 Java 中的字符串?

4

4 回答 4

11

我们如何读取或使用输出流的内容。

一般来说你不能。AnOutputStream是您写入字节的对象。通用 API 不提供任何方法来取回字节。

有特定类型的输出流可以让您取回字节。例如:

  • AByteArrayOutputStream有一个获取字节数组内容的方法。
  • APipeOutputStream有一个对应PipeInputStream的,您可以从中读取。
  • 如果您使用 aFileOutputStream写入文件,则通常可以打开 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”发送。

于 2013-08-03T05:54:47.340 回答
9

您可以执行以下操作:

  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();
        }
    };
于 2013-08-03T05:36:58.510 回答
2

主要您可以使用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();
于 2013-08-03T05:39:56.940 回答
0

如果您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.

于 2013-08-03T05:30:25.930 回答