在Java中,我如何计算下载期间网页下载的大小?

时间:2011-05-16 16:30:41

标签: java download size httpurlconnection

我想这样做:

我有一个donwload的最大限制大小(例如:10MB)。我开始下载网页。如果在达到限制之前页面下载尚未完成,我将停止下载。

我在这里做了一个类似的问题:In Java, it's possible determine the size of a web page before download?,但是在开始下载之前发现页面的大小,但是有些服务器不发送这些信息。现在我需要在下载过程中进行控制。

他们告诉我使用 CountInputStream 。这是方法吗?我使用 HttpUrlConnection ,所以下载不是用 getInputStream 完成的?

4 个答案:

答案 0 :(得分:2)

如果网络服务器支持它,你可以查看Content-Length标题,它会告诉你这有多大:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

如果服务器/项目不支持内容长度,您必须阅读整个内容并只计算字节...

您链接的答案似乎包含了您需要的大部分其他信息,这与您的问题几乎完全不同吗?

答案 1 :(得分:1)

您可以执行HTTP HEAD请求,但这只会返回网页的“内容长度”。

网页的大小很有趣,因为网页包含很多其他文档(例如图形)。 Content-Length并不是文档的“整体大小”,即使您此时询问内容长度,也不能保证内容长度在一毫秒之后就会相同。

对于静态页面,内容长度可能是可信的;但是,对于动态内容,我会认为内容长度有时是错误的或总是错误的。

答案 2 :(得分:1)

如果您使用HttpUrlConnection通过HTTP读取远程资源,则表示您正在使用HttpUrlConnection.getInputStream()读取远程资源返回的数据。

要计算从连接中读取时读取的字节数,只需...计算从inputStream读取的字节数。例如:

HttpUrlConnection conn = ...;
byte[] dataBuffer = new byte[MAX_BYTES];
InputStream stream = conn.getInputStream();
int bytesRead, totalRead = 0;
while (bytesRead != -1) {
    bytesRead = stream.read(dataBuffer, totalRead, bufferLength);
    totalRead += bytesRead;
    if (totalRead > MAX_BYTES) throw new FileTooBigException(...);
}

答案 3 :(得分:0)

如果确保启用了HTTP 1.1 keep-alive(连接:保持活动状态)并且服务器同意,则服务器必须发送内容长度。