如何确定是否允许范围而没有接受范围标题

时间:2015-07-07 00:44:26

标签: java header

我正在尝试创建一个多线程下载程序。为此,我得到InputStream这样的内容:

URLConnection cn = new URL(str).openConnection();
cn.setRequestProperty("Range", "bytes=" + first + "-" + last);
cn.connect();
cn.getInputStream();

如果允许请求文件的一部分,我会检查Accept-Ranges标头。我发现Accept-Ranges: none表示不允许这样做,但有时标题甚至不包含Accept-Ranges字段。有没有其他方法可以检查连接是否支持范围?例如,检查返回部分的长度是否等于last - first + 1

1 个答案:

答案 0 :(得分:0)

您可以请求两个不同的范围,将前N个字节读取到缓冲区,并进行比较。我认为8192个字节就足够了。

boolean doesAcceptRanges(String str)
{
    URLConnection cn1 = new URL(str).openConnection();
    cn1.setRequestProperty("Range", "bytes=" + 0 + "-" + 8192);
    cn1.connect();
    InputStream input1 = cn1.getInputStream();
    URLConnection cn2 = new URL(str).openConnection();
    cn2.setRequestProperty("Range", "bytes=" + 8193+ "-" + 16385);
    cn2.connect();
    InputStream input2 = cn2.getInputStream();
    byte[] buffer1 = new byte[8192];
    byte[] buffer2 = new byte[8192];
    input1.read(buffer1);
    input2.read(buffer2);
    if(Arrays.equals(buffer1, buffer2))
        return false;
    else
        return true;
}