当前位置: 首页 > 知识库问答 >
问题:

如何使用WebClient执行零拷贝上载和下载?

姬承教
2023-03-14

您可以使用Spring 5 WebFlux使用org.springframework.web.reactive.function.client.WebClient执行零拷贝上传和下载吗?

共有1个答案

刘阳舒
2023-03-14

您是对的,当从基于文件的资源发布数据时,现在支持零拷贝。

因此,以下内容看起来是正确的:

client.post()
      .body(BodyInserters.fromResource(new FileSystemResource(new File("file.txt"))));

现在对于读取部分,Spring框架中的读取端不支持零拷贝;您可以在jira上创建一个增强问题。Spring我非常感谢。

您的代码示例应该如下所示:

Flux<DataBuffer> incoming = client.post()
      .retrieve().bodyToFlux(DataBuffer.class);
Mono<Void> writeOperation = DataBufferUtils.write(incoming, channel)
      .map(DataBufferUtils::release)
      .then();
// subscribe to the returned value, which will complete when writing is done

不幸的是,将数据读取到DataBuffer不会进行零复制,因为数据将被复制到内存中。我认为阅读端不支持零拷贝,所以这可能是一个增强请求https://jira.spring.io.

 类似资料:
  • 问题内容: 您可以使用Spring 5 WebFlux执行零拷贝上传和下载吗? 问题答案: 是的,从基于File的文件发布数据时,现在支持零拷贝。 因此,以下内容看起来正确: 现在,对于阅读部分,Spring Framework中的阅读侧目前不支持零复制;您可以为此在jira.spring.io上创建一个增强问题。 您的代码示例应如下所示: 不幸的是,读取数据不会进行零复制,因为数据将被复制到内存

  • 主要内容:到底是浅拷贝还是深拷贝对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。例如: b 和 obj2 都是以拷贝的方式初始化的,具体来说,就是将 a 和 obj1 所在内存中的数据按照二进制位(Bit)复制到 b 和 obj2 所在的内存, 这种默认的拷贝行为就是 浅拷贝 ,这和调用 memcpy() 函数的效果非常类似。 对于简单的类,默认的拷贝构造函数一般就够用了,我们也没有必要再显式地定义一

  • 浅拷贝 对于对象或数组类型,当我们将a赋值给b,然后更改b中的属性,a也会随着变化。 也就是说,a和b指向了同一块堆内存,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝。 深拷贝 那么相应的,如果给b放到新的内存中,将a的各个属性都复制到新内存里,就是深拷贝。 也就是说,当b中的属性有变化的时候,a内的属性不会发生变化。 参考链接: 深拷贝与浅拷贝的实现(一) javaScript中浅拷

  • 本文向大家介绍Java克隆执行深拷贝,包括了Java克隆执行深拷贝的使用技巧和注意事项,需要的朋友参考一下 示例 要复制嵌套对象,必须执行深层复制,如本示例所示。            

  • 一、引言 对象拷贝(Object Copy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象中去。在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用对象的部分或全部数据。Java中有三种类型的对象拷贝:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)、延迟拷贝(Lazy Copy)。 二、浅拷贝 1、什么是浅拷贝 浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着

  • 本文向大家介绍javascript深拷贝和浅拷贝详解,包括了javascript深拷贝和浅拷贝详解的使用技巧和注意事项,需要的朋友参考一下 一、数组的深浅拷贝 在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生。 这是为什么呢? 因为如果只是简单的赋值,它只