我正在尝试使用以下方式获取网址内容的大小:
URLConnection conn = null;
URL url = null;
url = new URL("https://dl.dropboxusercontent.com/u/90210205/Default.html");
conn = url.openConnection();
conn.connect();
InputStream in = new BufferedInputStream(url.openStream());
int fileSize = conn.getContentLength();
System.out.println("File size " + fileSize);
while (in.read() != -1) {
i++;
}
in.close();
System.out.println("Read " + i + " bytes of a possible " + fileSize);
我在doInBackground()
的{{1}}范围内使用此功能,出于某种原因,AsyncTask
在返回conn.getContentLength();
时会返回1273
。< / p>
我在常规Java应用程序的Main中使用了上面的代码,10136
返回了正确的10136值。
为什么它不适用于conn.getContentLength();
?
答案 0 :(得分:2)
.getContentLength()
的描述是它返回Content-Length
标题字段的值。在通常情况下,这应该与可读数据量相匹配。然而...
(1)如果使用chunked-encoding发送数据,则标头可能不存在。在这种情况下,.getContentLength()
会返回-1
,因此此处似乎不是这样。
(2)默认情况下,HttpURLConnection
的实现请求服务器使用gzip压缩,并自动解压缩getInputStream()
的调用者的数据。在这种情况下,Content-Encoding和Content-Length响应头被清除。
最后一句似乎表明这也不是这里的情况,因为你没有从.getContentLength()获得-1
,但相对大小(1273/10136)让我怀疑......
对此的一个测试是通过在请求标头中设置可接受的编码来禁用Gzip编码:
urlConnection.setRequestProperty("Accept-Encoding", "identity");
另一个是窥探&#39; snoop&#39;网络流量,以观察http标头和数据量的线索。
BTW,url.openStream()
是url.openConnection().getInputStream()
的便利。