当前位置: 首页 > 面试题库 >

将InputStream写入HttpServletResponse

郜联
2023-03-14
问题内容

我有一个要写入HttpServletResponse的InputStream。有这种方法,由于使用byte []而需要花费很长时间

InputStream is = getInputStream();
int contentLength = getContentLength();

byte[] data = new byte[contentLength];
is.read(data);

//response here is the HttpServletResponse object
response.setContentLength(contentLength);
response.write(data);

我想知道在速度和效率方面,什么是最好的方法?


问题答案:

只需编写块,而不是先将其完全复制到Java内存中即可。下面的基本示例以10KB的块为单位编写。这样,您最终只能获得10KB的一致内存使用量,而不是完整的内容长度。最终用户也将更快地获取部分内容。

response.setContentLength(getContentLength());
byte[] buffer = new byte[10240];

try (
    InputStream input = getInputStream();
    OutputStream output = response.getOutputStream();
) {
    for (int length = 0; (length = input.read(buffer)) > 0;) {
        output.write(buffer, 0, length);
    }
}

作为性能方面的极品,您可以使用NIO
Channels和直接分配的ByteBuffer。在某些自定义实用程序类中创建以下实用程序/帮助程序方法,例如Utils

public static long stream(InputStream input, OutputStream output) throws IOException {
    try (
        ReadableByteChannel inputChannel = Channels.newChannel(input);
        WritableByteChannel outputChannel = Channels.newChannel(output);
    ) {
        ByteBuffer buffer = ByteBuffer.allocateDirect(10240);
        long size = 0;

        while (inputChannel.read(buffer) != -1) {
            buffer.flip();
            size += outputChannel.write(buffer);
            buffer.clear();
        }

        return size;
    }
}

然后,您可以使用以下方法:

response.setContentLength(getContentLength());
Utils.stream(getInputStream(), response.getOutputStream());


 类似资料:
  • 问题内容: 我使用下面的方法来写到: 我想知道这是否是使用NIO的正确方法。我已经阅读了一个方法,该方法带有三个参数: ReadableByteChannel src 好仓 长计 在我的情况下,我只有,而没有and和,有什么方法可以使用此方法来创建文件? 此外,对于Image,还有什么更好的方法可以仅从和NIO 创建映像? 任何信息对我来说都是非常有用的。在SO中也有类似的问题,但是我找不到适合我

  • 问题内容: 我有一个通过以下代码启动Java进程的代码(即:执行已编译的Java代码) 通过这一点,我基本上可以处理输出和错误 现在,如何将输入发送到?也就是说,如果进程执行的代码中有一行等待输入,如下所示: 我尝试了这个: 虽然什么都没发生。控制台仍在等待输入。 有什么想法吗? 编辑: 问题已得到回答,如下所示。我正在编辑以显示 错误的代码 (我未能包括btw。Lol)。 在开始之前,我有一个

  • 问题内容: 今天,我很惊讶地发现我找不到使用 将an 的内容写入an的任何简单方法。显然,字节缓冲区代码并不难编写,但是我怀疑我只是缺少了一些可以使我的生活更轻松的东西(并且代码更清晰)。 那么,给定和,是否有更简单的方法编写以下内容? 问题答案: Java 9 从Java 9开始,提供了一种带有以下签名的方法: 如文档所述,将: 从此输入流中读取所有字节,然后按读取顺序将字节写入给定的输出流。返

  • 在中有一个,可以将日志写入到。 我需要在中使用相同的功能,但我还没有找到这样做的选项。有人知道如何使用实现同样的效果吗?

  • 问题内容: 我正在使用json-rpc-1.0.jar。以下是我的代码。由于响应为JSON,因此我需要将InputStream对象转换为JSON。 我确实验证了从Zappos API获得的json响应。是有效的。 我得到以下提到的异常: 问题答案: 利用Jackson JSON解析器。 推荐- 杰克逊之家 您唯一需要做的是- 现在将包含JSON。

  • 问题内容: 我将如何将javafx.scene.image.Image图像写入文件。我知道您可以在BufferedImages上使用ImageIO,但是有什么方法可以使用javafx图像吗? 问题答案: 差不多3年后,我现在有知识去做并回答这个问题。是的,原始答案也是有效的,但它涉及到先将图像转换为BufferedImage,我理想上想完全避免摆动。虽然这确实会输出图像的原始RGBA版本,足以满足