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

时间:2013-08-03 05:26:36

标签: java servlets

我们如何阅读或使用outputstream的内容。 就我而言,我使用的是签名方法。

public static OutputStream decryptAsStream(InputStream inputStream,             String encryptionKey)

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

4 个答案:

答案 0 :(得分:7)

  

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

一般情况下你不能。 OutputStream是您将字节写入的对象。通用API不提供任何获取字节的方法。

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

  • ByteArrayOutputStream有一个获取字节数组内容的方法。
  • PipeOutputStream有一个您可以阅读的相应PipeInputStream
  • 如果使用FileOutputStream写入文件,则通常打开FileInputStream以读取文件内容...前提是您知道文件路径名。< / LI>

看一下这个方法,让我觉得方法签名错误就是你要做的。如果目的是为流提供加密器,则该方法应返回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

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

  • 无论哪种方式,您都不应将baos初始化为新创建的ByteArrayOutputStream实例,该实例会立即被丢弃。

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

答案 1 :(得分:5)

您可以执行以下操作:

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

答案 2 :(得分:0)

如果您从response获得了OutputStream,则可以将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:What are the differences between “inline” and “attachment”?


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

public static OutputStream decryptAsStream(InputStream inputStream,
                                            String encryptionKey)

因此,您可以从该方法获取OutputStream

OutputStream os = ClassName.decryptAsStream(inputStream,encryptionKey);

然后使用os

答案 3 :(得分:0)

主要是你可以使用outputstreams发送文件内容为@The New Idiot提到的。 .pdf文件,zip文件,图像文件等。

在这种情况下,获取servlet的输出流并写入contentes

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