2 回答
TA贡献1829条经验 获得超4个赞
从版本 11 开始,Java 有一个内置的HttpClient实现
具有非阻塞背压的异步数据流
如果您希望代码仅在有数据要处理时运行,这就是您所需要的。
如果您有能力升级到 Java 11,您将能够使用HttpResponse.BodyHandlers.ofFile正文处理程序开箱即用地解决您的问题。您不必自己实现任何数据传输逻辑。
科特林示例:
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贡献1856条经验 获得超17个赞
可以取消 BufferedInputStream。或者因为 Oracle 的 java 中的默认缓冲区大小是 8192,所以使用更大的 ByteArray,比如 4096。
但是最好是使用 java.nio 或尝试 Files.copy:
Files.copy(is, file.toPath());
这将删除大约 12 行代码。
另一种方法是发送带有标头的请求以压缩gzip压缩Accept-Encoding: gzip
,因此传输所需的时间更少。在这里的响应is
中new GZipInputStream(is)
,当Content-Encoding: gzip
给出响应标头时,可能会包含在- 中。或者,如果可行,存储压缩的文件,并附加结尾.gz
;mybiography.md
作为mybiography.md.gz
。
添加回答
举报