java - SetRequestProperty 有效,但下载完整大小

标签 java android download

尝试使用具有暂停/恢复功能的“输入/输出流”进行下载。 问题是当我将requestproperty设置为我下载的数量时:connection.setRequestProperty(“Range”,“bytes =”+downloaded+“-”); 并读取长度:int fileLength = connection.getContentLength(); 它给了我正确的数量,但在下载代码(while 循环)中,即使我设置了正确的请求,它也会下载文件的完整大小。

示例: 它开始正常下载

total:2048      data length:1570024
07-21 11:26:17.650 D: zz    path:v_3_1      total:4096      file length(should be full):1570024
07-21 11:26:17.650 D: zz    path:v_3_1      total:6144      file length(should be full):1570024
07-21 11:26:17.651 D: zz    path:v_3_1      total:8192      file length(should be full):1570024
07-21 11:26:17.652 D: zz    path:v_3_1      total:10240      file length(should be full):1570024
07-21 11:26:17.652 D: zz    path:v_3_1      total:12288      file length(should be full):1570024
07-21 11:26:17.653 D: zz    path:v_3_1      total:14336      file length(should be full):1570024
07-21 11:26:17.653 D: zz    path:v_3_1      total:16384      file length(should be full):1570024

在这里我暂停然后恢复它(工作正常):

     data length is:830696
07-21 11:26:30.949 D: zz    path:v_3_1      total:741376      file length(should be full):1570024
07-21 11:26:30.950 D: zz    path:v_3_1      total:743424      file length(should be full):1570024
07-21 11:26:30.950 D: zz    path:v_3_1      total:745472      file length(should be full):1570024
07-21 11:26:30.950 D: zz    path:v_3_1      total:747520      file length(should be full):1570024
07-21 11:26:30.950 D: zz    path:v_3_1      total:749568      file length(should be full):1570024
07-21 11:26:30.950 D: zz    path:v_3_1      total:751616      file length(should be full):1570024
07-21 11:26:30.951 D: zz    path:v_3_1      total:753664      file length(should be full):1570024
07-21 11:26:30.951 D: zz    path:v_3_1      total:755712      file length(should be full):1570024
07-21 11:26:31.070 D: zz    path:v_3_1      total:757760      file length(should be full):1570024
07-21 11:26:31.071 D: zz    path:v_3_1      total:759808      file length(should be full):1570024
07-21 11:26:31.074 D: zz    path:v_3_1      total:761856      file length(should be full):1570024
07-21 11:26:31.076 D: zz    path:v_3_1      total:763904      file length(should be full):1570024
07-21 11:26:31.077 D: zz    path:v_3_1      total:765952      file length(should be full):1570024
07-21 11:26:31.078 D: zz    path:v_3_1      total:768000      file length(should be full):1570024

但随后它会超过文件的完整大小并停止在 1570024(完整大小)+739328(我暂停之前的大小)...它应该只会上升到 1570024 并停止。

07-21 11:26:32.125 D: zz    path:v_3_1      total:1750816      file length(should be full):1570024

代码:

 try {
            URL url = new URL(sUrl[1]);
            URLConnection connection = url.openConnection();

            if(resume){downloaded=viv.getIsdown2(path);
            connection.setRequestProperty("Range", "bytes=" + downloaded + "-");}
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.connect();
            int fileLength = connection.getContentLength();
           Log.d("dt", "zz    "+path+"               data length is:" + fileLength);
            fos = new FileOutputStream(outfile);
            fis = new FileInputStream(outfile);
            encipher = Cipher.getInstance("AES");
            encipher.init(Cipher.ENCRYPT_MODE, secretKey);
            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream(outfile);
            cis = new CipherInputStream(fis, encipher);
            byte data[] = new byte[8 * 1024];
           total = downloaded;
          //  total = 0;
            fileLength+=downloaded;
            int count;
            while ((count = input.read(data)) !=-1) {

                total += count;
                progpercent = (int) (total * 100 / fileLength);
                publishProgress(progpercent, total); Log.d("dt", "zz    path:"+path+"      total:" + total+"      file length(should be full):" + fileLength);
                output.write(data, 0, count);
            if(isCancelled())break;


            }
                output.flush();
                output.close();
                input.close();

更新:既然我弄清楚了我的主要问题的答案是什么,另一个问题是,即使在 fileoutputStream 中使用append=true,写入的文件也会覆盖当前的文件,我不知道为什么......有什么建议吗?

最佳答案

在暂停下载之前跟踪已下载的大小,并在恢复功能中,您可以确保从总量中减去暂停之前已下载的量,以获得剩余下载量。

connection.setRequestProperty("Range", "bytes=" + (total - downloaded) + "-");}

关于java - SetRequestProperty 有效,但下载完整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57132872/

相关文章:

Java Apache POI 错误

java - Iterator.hasNext() 在从集合中移除() 之后变得疯狂

java - 将带有多个 "list[]"参数的响应体反序列化到Java中的List

android - 新的Android WebView和CrossWalk WebView性能一样吗

c# - 向用户界面报告下载进度

java - android - 带有随机图片的动画

java - Android MapView animateTo 和 ZoomIn 同时进行

java - 无法从 Tomcat 应用程序中的挂载点下载文件

apache - Apache 后面的 Tomcat 下载 Servlet 导致 httpd 高 CPU

android - 如何从 RecyclerView 清除数据监听器/订阅?