gpt4 book ai didi

java恢复中断下载

转载 作者:行者123 更新时间:2023-11-30 10:50:42 25 4
gpt4 key购买 nike

我已阅读此站点中的许多文章,但找不到可行的解决方案。我正在从 url 下载文件。如果下载中断,我想从中断的地方继续。

源代码:

URL url = new URL("url");
connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Range",file.length()+"-");
connection.connect();

input = connection.getInputStream();
output = new FileOutputStream("/sdcard/Android/appdata/tmp/tmpdl/something.apk");

byte data[] = new byte[4096];
long total = 0;
int count;
continueDownload = true;

while ((count = input.read(data)) != -1 && continueDownload)
{
total += count;
output.write(data, 0, count);
System.out.println("continueDownload1: " + continueDownload);
}

任何想法!谢谢

最佳答案

这里还有一件事要说......服务器必须支持范围(搜索有关 HTTP header “Accept-Ranges:bytes”的更多信息)......这不是一件显而易见的事情,并不是每个服务器都这样做(我的经验就是很多服务器不支持)……

然后您可以修改您的解决方案,例如:http://blog.adeel.io/2017/09/24/resuming-a-http-download-in-java/

但实际上它是如何工作的呢?服务器第一次发送整个文件。某些东西断开连接后,必须建立新的连接并且服务器必须收到只发送部分下载文件的请求——它接受丢失的字节范围,然后它恢复下载,只发送请求的数据第二次;即使那样,某些事情也可能会(再次)断开连接,即使这样,整个过程也必须再次重复。这意味着您还必须在您的(客户端)端“恢复”下载——您必须重新开始并从客户端发送“Range” header 。

根据上面的来源,您必须检查您的文件是否已部分下载:

// Add this right after you initialize httpUrlConnection but before beginning download
if (file.exists())
httpUrlConnection.setRequestProperty("Range", "bytes=" + file.length() + "-");

同时打开附加数据的文件:

// And then you’d initialize the file output stream like so:
if (file.exists())
fos = new FileOutputStream(file, true); // resume download, append to existing file
else
fos = new FileOutputStream(file);

(我建议将 file.exists 结果存储到某个 boolean 变量中……)

但请注意,在循环正确完成之前,您永远不知道必须接收多少字节……好的做法是将数据保存在某个临时文件(例如 *.*-part)中,并在下载运行后保存最后将其完全重命名为正确的名称……(浏览器也会这样做。)

(……我希望它能在一段时间后对某人有所帮助……)

关于java恢复中断下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34992386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com