【问题标题】:In Java, how I count the size of the download of a webpage during the download?在Java中,我如何计算下载过程中网页下载的大小?
【发布时间】:2011-05-16 16:30:40
【问题描述】:

我想这样做:

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

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

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

【问题讨论】:

  • 您的意思是“网页”还是“通过 http 的内容”?因为正如其他人所说,许多页面现在将具有动态内容,这些内容不会通过逐字节读取页面来到达,只能通过 javascript/etc 与之交互。
  • 哦,只有通过 http 的内容。我不需要图像、脚本、css 等。只需要 HTML/生成的内容。页面的源代码。

标签: java download size httpurlconnection


【解决方案1】:

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

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

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

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

【讨论】:

  • 不,在那个问题中我想知道下载前的大小,现在我需要在下载时计算字节数以阻止他,如果达到一定的限制大小。
  • 但是如果你之前已经知道大小,为什么还要开始下载呢?如果您已经以某种方式下载该文件,则必须将其放在某处,对吗?如果是这样,你不能在阅读它们时计算字节数吗?
  • 大部分服务器不发送页面大小,所以不知道大小。获取大小的唯一方法是开始下载并计算字节数。
  • 反对票是怎么回事?我的回答甚至有第二个建议“如果服务器/项目不支持内容长度,您必须阅读整个内容并计算字节数......”这正是其他答案所说的。 .
【解决方案2】:

如果您使用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】:

    您可以发出 HTTP HEAD 请求,但这只会返回网页的“Content-Length”。

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

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

    【讨论】:

    • 进行头部请求不会传输整个页面,从而减少了通过网络传输的字节数。
    • 如果服务器不发送内容长度?
    • 那么你必须下载页面。如果系统没有告诉你它的长度,或者你自己测量它,我无法正确理解你如何期望知道这些内容的长度。如果你想在你的任意范围内“切断”内容,我希望你记住,在 HTML 中,一半的文档不会关闭它的标签,并且不能被许多程序认为是可用的。不保证文档的第一个“部分”即使没有“后面的部分”也会显示任何内容。
    • 是的,我知道我必须下载页面,我的疑问是我如何在下载时测量下载的大小,而不是在下载完成后。关于不完整,这不重要,我将丢弃这些超出限制的页面。例如,如果某些内容通过了过滤器并开始下载大文件,则更要谨慎。
    • 一次从流中读取一个字节,并保留一个计数器,为读取的每个字节递增。真的就像听起来一样简单。
    【解决方案4】:

    如果您确保启用了 HTTP 1.1 keep-alive(连接:keep-alive)并且服务器同意,则服务器有义务发送内容长度。

    【讨论】:

      猜你喜欢
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 2023-04-08
      • 2011-05-29
      • 2014-09-22
      相关资源
      最近更新 更多