前面的答案没有错,但它们没有深入到我喜欢看到的深度。在某些情况下,处理低级别不仅是可取的,而且是必要的,最常见的例子是将大文件从源(某些Web服务器)流式传输到目标(数据库)。如果您尝试使用 ,那么毫不奇怪,您会受到 .是的,您可以滚动自己的HTTP客户端代码,但您必须处理错误的响应代码,响应转换器等。如果您已经在使用Spring,那么寻找是一个自然的选择。InputStream
ByteArrayInputStream
OutOfMemoryError
RestTemplate
在撰写本文时,有一个 具有 ,如果设置,并且响应类型为 ,则返回 ;否则,它将返回 .很明显,你不是唯一一个要求流媒体支持的人。spring-web:5.0.2.RELEASE
ResourceHttpMessageConverter
boolean supportsReadStreaming
InputStreamResource
InputStreamResource
ByteArrayResource
但是,存在一个问题:在运行后立即关闭响应。因此,即使您要求 ,并得到了它,它也不好,因为响应流已关闭。我认为这是他们忽略的设计缺陷;它应该依赖于响应类型。所以不幸的是,对于阅读,你必须充分消费回应;如果使用 .,则无法传递它。RestTemplate
HttpMessageConverter
InputStreamResource
RestTemplate
不过,写作是没有问题的。如果你想流一个,会为你做。在引擎盖下,它用于一次写入 4096 个字节,从 到 。InputStream
ResourceHttpMessageConverter
org.springframework.util.StreamUtils
InputStream
OutputStream
某些媒体类型支持所有媒体类型,因此根据您的要求,您可能必须从中删除默认媒体类型,并设置所需的媒体类型,同时注意它们的相对顺序。HttpMessageConverter
RestTemplate
最后但并非最不重要的一点是,如果您正在上传大型流,则可以并且应该将其设置为。否则,您知道。在撰写本文时,(JDK 客户端)和(Apache HTTP 客户端)支持此功能,但不支持 。同样,设计监督。ClientHttpRequestFactory
boolean bufferRequestBody
false
OutOfMemoryError
SimpleClientHttpRequestFactory
HttpComponentsClientHttpRequestFactory
OkHttp3ClientHttpRequestFactory
编辑:提交票证SPR-16885。