繁体   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