如何用jsoup限制下载大小?

时间:2012-07-16 19:55:57

标签: jsoup

我正在尝试使用JSoup限制下载页面/链接的大小,给出类似以下内容(Scala代码):

val document = Jsoup.connect(theURL).get();

我想只获取给定页面的前几KB,并停止尝试下载。如果有一个非常大的页面(或theURL是一个非html的链接,并且是一个大文件),我不想花时间下载其余的。

我的用例是IRC机器人的页面标题snarfer。

奖金问题:

是否有任何理由说明Jsoup.connect(theURL).timeout(3000).get();没有超时大文件?如果有人粘贴像永无止境的音频流或大型ISO(可以通过在不同的线程中获取URL标题(或使用Scala actor并在那里计时)来解决它,最终导致机器人ping通),但是当我认为timeout()应该完成相同的最终结果时,对于一个非常简单的机器人来说似乎有些过分了。)

3 个答案:

答案 0 :(得分:6)

现在,您可以使用maxBodySize()方法限制版本1.7.2的最大体型。 http://jsoup.org/apidocs/org/jsoup/Connection.Request.html#maxBodySize() 默认情况下,限制为1MB,这可以防止内存泄漏。

答案 1 :(得分:2)

奖励回答您的红利问题:超时定义为连接和套接字转移超时。因此,如果连接花费的时间少于超时时间,并且您从服务器接收的数据包比超时更频繁,则超时将永远不会触发。

据我所知,这并不是非常直观的,并且希望将其移至完全耗尽的挂钟时间。但是为了向后兼容,我可能需要使它成为一种不同的方法(征求意见)。

现在应该在1.7.2+中使用最大体型来防止永无止境的音频流。但是如果没有挂钟超时,它仍然会被故意缓慢的服务器抓住,这些服务器会以3秒的延迟逐位响应。

答案 2 :(得分:0)

不要以为你可以用JSoup做到这一点。 JSoup没有流模式(然后将InputStream转换为String)。

如果你想下载几KB的数据,我建议你使用Apache HTTPClient或Ning AsyncHttpClient来播放响应流。您可以随时停止检索数据。