2012-07-16 50 views
3

我试图限制与JSoup下载的页面/链接的大小,给出类似如下(Scala代码):如何用jsoup限制下载大小?

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

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

我的用例是一个IRC bot的页面标题snarfer。

奖金的问题:

有什么理由Jsoup.connect(theURL).timeout(3000).get();上没有大文件超时?如果有人粘贴像永不落幕的音频流或大ISO(可以通过在不同的线程中获取URL标题来解决(或者使用Scala演员并在那里定时)来解决这个问题),那么它最终会导致bot僵住。但是,看起来像一个非常简单的机器人,当我认为timeout()应该完成相同的最终结果)矫枉过正。

回答

0

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

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

2

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

我知道这并不是非常直观,并且希望将其移至总的过期wallclock超时。但为了向后兼容,我可能需要使它成为一种不同的方法(征求意见)。

现在应该在1.7.2+以最大的身体尺寸阻止永不停止的音频流。但是,如果没有wallclock超时,它仍然可能会被故意缓慢的服务器所捕获,从而导致响应速度缓慢3秒。