我需要从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:
基于:Streaming Large Files In a 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);
}
如果还有其他/更好的选择,请分享。
答案 0 :(得分:0)
选项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
并不是其中任何一种。