我们如何读取或使用输出流的内容 [已关闭]

2022-09-04 08:15:52

我们如何读取或使用输出流的内容。在我的情况下,我正在使用具有签名的方法。

公共静态输出流解密AsStream(InputStream inputStream, String EncryptionKey)

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


答案 1

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

一般来说,你不能。是将字节写入的对象。常规 API 不提供任何方法来取回字节。OutputStream

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

  • A 具有用于获取字节数组内容的方法。ByteArrayOutputStream
  • A 有一个可以读取的对应项。PipeOutputStreamPipeInputStream
  • 如果使用 a 写入文件,通常可以打开 a 来读取文件内容...前提是您知道文件路径名。FileOutputStreamFileInputStream

看看这种方法,我突然发现方法签名对于您尝试执行的操作是错误的。如果目的是为流提供加密器,则该方法应返回 .如果目的是在某个地方写入加密数据,则该方法应返回并采用一个额外的参数,该参数是该方法应写入的参数。(然后调用方可以使用子类来捕获加密的数据...如果这是想要的。InputStreamvoidOutputStreamOutputStream

另一种“有效”的替代方法是更改方法的签名以生成返回类型(或文件名)。但这不是一个好的解决方案,因为它剥夺了调用方决定将加密输出发送到何处的能力。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.decryptAsStreamByteArrayOutputStream

  • 如果已声明为返回 a,则应将其直接分配给 。ByteArrayOutputStreambaos

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

还值得注意的是,内容类型不正确。如果您将该响应发送到浏览器,它将尝试将加密数据解释为图像...并失败。从理论上讲,您可以设置一个内容编码标头...但是没有一个会起作用。因此,最好的解决方案是将内容类型作为“应用程序/八位字节流”发送。


答案 2

您可以执行如下操作:

  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();
        }
    };

推荐