我正在使用Tomcat 8.5(嵌入式Spring Boot)运行我的API服务器。有1个API需要从服务器的文件系统中读取图像文件,然后将其返回。由于该API将被大量使用,因此我想探索提高其性能的方法。我想知道是否可以直接将文件发送给响应而不将其复制到JVM中。 NIO软件包似乎是这里的选择,但是我不确定Tomcat HttpServletResponse是否支持它。
Channels.newChannel(response.getOutputStream())
似乎只返回一个包装器。
通常,我不确定以下实现是否在下面使用NIO(直接内核空间复制)还是仅使用传统IO。
Path path = Paths.get(filePath);
try (FileChannel fileChannel = FileChannel.open(path);
ServletOutputStream outputStream = response.getOutputStream()) {
long size = fileChannel.size();
int position = 0;
WritableByteChannel outChannel = Channels.newChannel(outputStream);
while (position < size) {
position += fileChannel.transferTo(position, size, outChannel);
}
}