5

我正在尝试使用以下方法获取 URL 内容的大小:

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()an 中使用它,AsyncTask并且由于某种原因在它应该conn.getContentLength();返回时返回。127310136

我在常规 Java 应用程序的 Main 中使用了上述代码并conn.getContentLength();返回正确的 10136 值。

为什么它不在一个工作AsyncTask

4

1 回答 1

3

的描述.getContentLength()是它返回Content-Length头字段的值。在一般情况下,这应该与可供读取的数据量相匹配。然而...

(1) 如果使用分块编码发送数据,则可能不存在标头。在这种情况下,.getContentLength()返回-1所以这里似乎不是这种情况。

(2) 默认情况下,HttpURLConnection服务器的请求执行使用 gzip 压缩,它会自动为调用者解压缩数据getInputStream()。在这种情况下,Content-Encoding 和 Content-Length 响应标头被清除。

最后一句话似乎表明这也不是这里的情况,因为你不是-1从 .getContentLength()` 得到的,但是相对大小(1273 / 10136)让我怀疑......

对此的一项测试是通过在请求标头中设置可接受的编码来禁用 Gzip 编码:

urlConnection.setRequestProperty("Accept-Encoding", "identity");

另一种方法是“窥探”网络流量以观察 http 标头和数据量以获取线索。

顺便说一句,url.openStream()url.openConnection().getInputStream().

于 2016-01-31T18:23:20.903 回答