java - 从服务器下载大文件需要很长时间

标签 java

我正在尝试从 Kaltura 下载文件(.mp4),文件超过 100mb,下面的代码需要花费大量时间来下载。

还有其他方法可以改进吗?

try {
        URL url = new URL("https://www.kaltura.com/p/....");
        InputStream in = new BufferedInputStream(url.openStream());
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        byte[] buf = new byte[8192];
        int n = 0;
        while (-1 != (n = in.read(buf)))
        {
            out.write(buf);
        }
        out.close();
        in.close();     
        res.setContentType("application/octet-stream");
        res.setHeader("Cache-Control", "no-cache");
        res.setHeader("Content-Disposition","attachment;filename=Smac_03_48.mp4 (iPad).mp4");
        res.setStatus(200);
        res.getOutputStream().write(out.toByteArray());
    } catch (Exception e) {
        e.printStackTrace();
    }

最佳答案

问题是 ByteArrayOutputStream 将急剧增长,不时重新分配其大小。相反,立即输出:

try {
    URL url = new URL("https://www.kaltura.com/p/....");
    InputStream in = new BufferedInputStream(url.openStream());
    res.setContentType("application/octet-stream");
    res.setHeader("Cache-Control", "no-cache");
    res.setHeader("Content-Disposition","attachment;filename=Smac_03_48.mp4 (iPad).mp4");
    res.setStatus(200);
    OutputStream out = res.getOutputStream();
    byte[] buf = new byte[8192];
    int n = 0;
    while (-1 != (n = in.read(buf)))
    {
        out.write(buf);
    }
    out.flush();
    in.close();     
} catch (Exception e) {
    e.printStackTrace();
}

当然,浏览器重定向会更快。

关于java - 从服务器下载大文件需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50346548/

相关文章:

java - ListView内部布局

java - 在 Java 中返回 <ClassName>.class 而不是简单地返回 <ClassName>?

java - android使用asynctask解析json

java - 这是对泛型的适当使用吗?

java - Servlet POST 数据根据调用者进行裁剪

java - 将 ARGB 颜色值转换为 ABGR 的快速算法?

java - 如何使用 Java Http 客户端发送带有 multipart/form-data 主体的 PUT 请求?

java - 使用 Java 从文件中读取特定行和列

java - jax-ws webservice 中的泛型类会发生什么变化?

Java - 只执行一次SQL查询