第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何更有效地通過 http 下載大文件?

如何更有效地通過 http 下載大文件?

猛跑小豬 2021-12-01 20:00:33
我正在嘗試在 Kotlin 中下載大文件(<1GB),因為我已經(jīng)知道我在使用 okhttp 并且?guī)缀踝裱诉@個問題的答案。除了我使用 Kotlin 而不是 java,所以語法略有不同。val client = OkHttpClient()val request = Request.Builder().url(urlString).build()val response = client.newCall(request).execute()val is = response.body().byteStream()val input = BufferedInputStream(is)val output = FileOutputStream(file)val data = ByteArray(1024)val total = 0Lval count : Intdo {    count = input.read(data)    total += count    output.write(data, 0, count)} while (count != -1)output.flush()output.close()input.close()它的工作原理是它在不使用太多內(nèi)存的情況下下載文件,但它似乎不必要地?zé)o效,因為它不斷嘗試寫入更多數(shù)據(jù)而不知道是否有新數(shù)據(jù)到達(dá)。在資源非常有限的 VM 上運行它時,我自己的測試似乎也證實了這一點,因為它似乎使用了更多的 CPU,同時下載速度低于 python 中的類似腳本,并且原因使用wget.我想知道是否有一種方法可以讓我在 x 字節(jié)可用時調(diào)用回調(diào),或者它是否是文件的末尾,這樣我就不必在不知道是否存在的情況下不斷嘗試獲取更多數(shù)據(jù)是任何。編輯:如果 okhttp 不可能,我使用其他東西沒有問題,只是它是我習(xí)慣的 http 庫。
查看完整描述

2 回答

?
浮云間

TA貢獻(xiàn)1829條經(jīng)驗 獲得超4個贊

從版本 11 開始,Java 有一個內(nèi)置的HttpClient實現(xiàn)


具有非阻塞背壓的異步數(shù)據(jù)流


如果您希望代碼僅在有數(shù)據(jù)要處理時運行,這就是您所需要的。


如果您有能力升級到 Java 11,您將能夠使用HttpResponse.BodyHandlers.ofFile正文處理程序開箱即用地解決您的問題。您不必自己實現(xiàn)任何數(shù)據(jù)傳輸邏輯。


科特林示例:


fun main(args: Array<String>) {    

    val client = HttpClient.newHttpClient()


    val request = HttpRequest.newBuilder()

            .uri(URI.create("https://www.google.com"))

            .GET()

            .build()


    println("Starting download...")

    client.send(request, HttpResponse.BodyHandlers.ofFile(Paths.get("google.html")))

    println("Done with download.")

}


查看完整回答
反對 回復(fù) 2021-12-01
?
慕慕森

TA貢獻(xiàn)1856條經(jīng)驗 獲得超17個贊

可以取消 BufferedInputStream?;蛘咭驗?Oracle 的 java 中的默認(rèn)緩沖區(qū)大小是 8192,所以使用更大的 ByteArray,比如 4096。

但是最好是使用 java.nio 或嘗試 Files.copy:

Files.copy(is, file.toPath());

這將刪除大約 12 行代碼。

另一種方法是發(fā)送帶有標(biāo)頭的請求以壓縮gzip壓縮Accept-Encoding: gzip,因此傳輸所需的時間更少。在這里的響應(yīng)isnew GZipInputStream(is),當(dāng)Content-Encoding: gzip給出響應(yīng)標(biāo)頭時,可能會包含在- 中?;蛘撸绻尚?,存儲壓縮的文件,并附加結(jié)尾.gzmybiography.md作為mybiography.md.gz。


查看完整回答
反對 回復(fù) 2021-12-01
  • 2 回答
  • 0 關(guān)注
  • 313 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號