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.")
}

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)is
中new GZipInputStream(is)
,當(dāng)Content-Encoding: gzip
給出響應(yīng)標(biāo)頭時,可能會包含在- 中?;蛘撸绻尚?,存儲壓縮的文件,并附加結(jié)尾.gz
;mybiography.md
作為mybiography.md.gz
。
添加回答
舉報