![](/img/trans.png)
[英]What is the best way to return big chunks of binary data from a webservice?
[英]What is the best ways to return a big file from jetty server?
我需要從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
並不是其中的任何一種。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.