gpt4 book ai didi

java - 如何通过Spring-Feign获取InputStream?

转载 作者:太空宇宙 更新时间:2023-11-04 09:23:14 28 4
gpt4 key购买 nike

我想通过Spring-OpenFeign以零拷贝的方式从服务器下载并保存文件到本地目录。

简单的下载方法如下:

import org.apache.commons.io.FileUtils

@GetMapping("/api/v1/files")
ResponseEntity<byte[]> getFile(@RequestParam(value = "key") String key) {
ResponseEntity<byte[]> resp = getFile("filename.txt")
File fs = new File("/opt/test")
FileUtils.write(file, resp.getBody())
}

在这段代码中,数据流将像这样feign Internal Stream -> Buffer -> ByteArray -> Buffer -> File

如何以更节省内存且更快的方式下载并保存文件?

最佳答案

TL;博士。使用ResponseEntity<InputStreamResource>和Java NIO

根据SpringDecoder , Spring 使用 HttpMessageConverters 解码响应

ResourceHttpMessageConverter 是 HttpMesageConverters 之一,返回 InputStreamResource其中包含从Content-Disposition派生的InputStream和文件名。

但是,ResourceHttpMessageConverter 必须初始化 supportsReadStreaming = true (default value)如果您对此实现有进一步的兴趣,check this code .

因此,更改后的代码如下:

@GetMapping("/api/v1/files")
ResponseEntity<InputStreamResource> getFile(@RequestParam(value = "key") String key)

JDK9

try (OutputStream os = new FileOutputStream("filename.txt")) {
responeEntity.getBody().getInputStream().transferTo(os);
}

JDK8 或更低版本

使用 Guava ByteStreams.copy()

Path p = Paths.get(responseEntity.getFilename())
ReadableByteChannel rbc = Channels.newChannel(responeEntity.getBody().getInputStream())
try(FileChannel fc = FileChannel.open(p, StandardOpenOption.WRITE)) {
ByteStreams.copy(rbc, fc)
}

现在,Feign Internal Stream -> File

关于java - 如何通过Spring-Feign获取InputStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58051623/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com