簡體   English   中英

從碼頭服務器返回大文件的最佳方法是什么?

[英]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);
}

這是您提供的唯一出現的選項,它實際上似乎將任何內容從服務器復制到客戶端。 還有其他方法可以完成此操作,但是返回FileFileInputStream並不是其中的任何一種。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM