我们如何阅读或使用outputstream的内容

ami*_*ngh 8 java servlets

我们如何阅读或使用outputstream的内容.就我而言,我正在使用一种具有签名的方法.

public static OutputStream decryptAsStream(InputStream inputStream,String encryptionKey)

此方法返回OutputStream.我想让OutputStream成为String.是否可以将java.io.OutputStream的输出传递给Java中的String?

Ush*_*ani 7

您可以执行以下操作:

  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();
        }
    };
Run Code Online (Sandbox Code Playgroud)


Ste*_*n C 7

我们如何阅读或使用outputstream的内容.

一般来说,你不能.An OutputStream是您将字节写入的对象.通用API不提供任何获取字节的方法.

有一些特定类型的输出流可以让你返回字节.例如:

  • A ByteArrayOutputStream具有获取字节数组内容的方法.
  • A PipeOutputStream有一个PipeInputStream你可以阅读的对应物.
  • 如果使用a FileOutputStream来写入文件,通常可以打开a 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);
Run Code Online (Sandbox Code Playgroud)

这可能有效,但代码很差:

  • 如果AESHelper.decryptAsStream是你编写的方法(它看起来像是!),那么你应该将它声明为返回a ByteArrayOutputStream.

  • 如果它已被声明为返回a ByteArrayOutputStream,则应直接将其指定给baos.

  • 无论哪种方式,您都不应该初始化baosByteArrayOutputStream立即被丢弃的新创建的实例.

值得注意的是Content-Type不正确.如果您将该响应发送到浏览器,它将尝试将加密数据解释为图像...并失败.从理论上讲,您可以设置Content-Encoding标头......但是没有一个可以工作.所以最好的解决方案是将Content-Type作为"application/octet-stream"发送.


NIN*_*OOP 0

OutputStream如果您从 中获得response,您可以将 的内容写入OutputStream将发送回浏览器的响应。示例代码:

\n\n
OutputStream outStream = response.getOutputStream();\nresponse..setHeader("Content-Disposition", "attachment; filename=datafile.xls");\nresponse.setContentType("application/vnd.ms-excel");\nbyte[] buf = new byte[4096];\nint len = -1;\nwhile ((len = inStream.read(buf)) != -1) {\n    outStream.write(buf, 0, len);\n}\n\noutStream.flush();\noutStream.close();\n
Run Code Online (Sandbox Code Playgroud)\n\n

阅读此内容:内容处置:\xe2\x80\x9cinline\xe2\x80\x9d 和 \xe2\x80\x9cattachment\xe2\x80\x9d 之间有什么区别?

\n\n
\n\n

在您的情况下,方法定义是:

\n\n
public static OutputStream decryptAsStream(InputStream inputStream,\n                                            String encryptionKey)\n
Run Code Online (Sandbox Code Playgroud)\n\n

OutputStream所以你可以从该方法中得到:

\n\n
OutputStream os = ClassName.decryptAsStream(inputStream,encryptionKey);\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后使用os.

\n