从码头服务器返回大文件的最佳方法是什么?



我需要从 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);
}

这是您提供的唯一选项,实际上似乎可以将任何内容从服务器复制到客户端。还有其他方法可以实现这一点,但返回FileFileInputStream都不是其中之一。

相关内容

最新更新