我正在尝试创建一个多线程下载程序。为此,我得到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
?
答案 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;
}