2012-07-16 96 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秒。