如何在不使用Content-Length的情况下有效地找出要下载的文件的总大小

时间:2015-01-29 23:17:45

标签: java http http-headers download server

我知道可以使用响应标头的content-length字段来完成。但是当响应头不包含content-length字段时会发生什么?我尝试二进制搜索文件中存在哪个最大字节。我使用此方法进行二进制搜索,以检查要下载的文件是否包含byteNo字节 -

private boolean fileContainsByte(long byteNo) {
    try {
        URLConnection urlConnection = url.openConnection();
        urlConnection.setRequestProperty("User-Agent", "");
        urlConnection.setRequestProperty("Range", "bytes=" + byteNo + "-");
        urlConnection.connect();

        InputStream inputStream = urlConnection.getInputStream();
        int v = inputStream.read();

        if (v == -1)
            return false;

        return true;
    } catch (IOException ex) {
        return false;
    }
}

但二进制搜索以确定文件长度的结果非常慢。此外,对于某些下载文件,此方法不起作用(可能对于不支持下载文件的range标题字段的服务器而言。)

我搜索了很多内容并没有找到解决此问题的方法。我已经注意到了例如这个Book。我甚至无法使用我的代码确定文件大小(尝试content-length方法,如果失败则执行二进制搜索)。但是当我尝试使用wGet或IDM下载它们时,它们的总文件大小会在创建下载后的2秒内显示出来。他们是怎么做到的?

0 个答案:

没有答案