我需要从 Jetty 服务器返回一个大文件,我在公司的源代码中建立了 3 种不同的方法来做到这一点。我现在正试图了解它们在性能、内存和时间方面的优缺点。
选项 A:
Path path = <FilePath>;
return path.toFile();
最容易写。但是,它是否会导致在发送之前将整个文件加载到内存中?还是码头直播?
选项 B:
Path path = <FilePath>;
return new FileInputStream(path.toFile());
与选项 A 相比,在此处将文件转换为流式传输是否有任何效果?
选项 C:
Path path = <FilePath>;
return new StreamingOutput() {
@Override
public void write(final OutputStream out) throws IOException {
copy(path, out);
}
};
这里需要副本吗? 与选项B相比,这不是多余的吗?
选项 D:基于:
在 Java Servlet 中流式传输大文件
Path path = <FilePath>;
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(path.toFile());
out = response.getOutputStream();
IOUtils.copy(in, out);
} finally {
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
}
如果有其他/更好的选择,请分享。
选项 A:
Path path = <FilePath>;
return path.toFile();
最容易写。但是,它是否会导致在发送之前将整个文件加载到内存中?
不。
还是码头直播?
不。所有这些操作都是返回一个File
对象。
选项 B:
Path path = <FilePath>;
return new FileInputStream(path.toFile());
与选项 A 相比,在此处将文件转换为流式传输是否有任何效果?
是的,但不是有用的效果。它返回一个FileInputStream
,这在连接的另一端没有任何用处。
选项 C:
Path path = <FilePath>;
return new StreamingOutput() {
@Override
public void write(final OutputStream out) throws IOException {
copy(path, out);
}
};
这里需要副本吗?
是的。
与选项B相比,这不是多余的吗?
不。这是否真的有效完全取决于StreamingOutput
是什么,你还没有告诉我们。
选项 D: 基于:在 Java Servlet 中流式传输大文件
Path path = <FilePath>;
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(path.toFile());
out = response.getOutputStream();
IOUtils.copy(in, out);
} finally {
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
}
这是您提供的唯一选项,实际上似乎可以将任何内容从服务器复制到客户端。还有其他方法可以实现这一点,但返回File
或FileInputStream
都不是其中之一。