5月31日至6月3日:高效在线下载服务器文件,支持应用内进度显示与断点续传功能

更新:11-01 名人轶事 我要投稿 纠错 投诉

各位老铁们,大家好,今天由我来为大家分享5月31日至6月3日:高效在线下载服务器文件,支持应用内进度显示与断点续传功能,以及的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

if (beginDownload.getText().equals("安装")){

意图intent=new Intent(Intent.ACTION_VIEW);

intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");//Type有哪些

启动活动(意图);

}

多线程分段下载,断点下载

如果我自己开发会有哪些疑问:

Q: 下次下载时如何从上次保存的点开始下载,不同线程下载时如何操作同一个文件?

A:skipBytes(long i): 从前到后,seek(long p): 从后到前,随机访问类

Q: 一个文件需要在多个线程中下载。如何给每个线程分配数据长度?

A:

//计算每个线程下载的数据长度。如果可以整除,则平分。如果不能整除,则直接加1。

this.block=(this.fileSize % this.threads.length)==0 ?文件大小

/this.threads.length

: this.fileSize/this.threads.length + 1;Q: 如何从服务器获取文件到指定位置开始下载

A:

block是每个线程下载的长度,downlength是下载的长度int startPos=block * (threadId - 1) + downLength; //起始位置

int endPos=块* threadId - 1; //结束位置

http.setRequestProperty("Range", "bytes=" + startPos + "-"+ endPos);//设置获取实体数据的范围。如果是第一次下载,downlength为0

例如19有两个线程,则块为10, 1,0~9 2,10~19

或者18点三线。区块为6, 1, 0~5 2,611, 1217

参考帖子:

http://blog.csdn.net/wwj_748/article/details/20146869

使用本地数据库记录不同线程最后下载的位置,根据这个位置去服务器获取指定位置的字节。

HttpURLConnection http=(HttpURLConnection) downUrl

.openConnection();

http.setConnectTimeout(5 * 1000); //设置连接超时时间

http.setRequestMethod("GET"); //设置请求方式,这里是“GET”

//浏览器接受的MIME类型

http.setRequestProperty(

"接受",

"图像/gif、图像/jpeg、图像/pjpeg、图像/pjpeg、应用程序/x-shockwave-flash、应用程序/xaml+xml、应用程序/vnd.ms-xpsdocument、应用程序/x-ms-xbap、应用程序/x -ms-application、application/vnd.ms-excel、application/vnd.ms-powerpoint、application/msword、*/*");

http.setRequestProperty("Accept-Language", "zh-CN"); //浏览器所需的语言类型,当服务器可以提供多种语言版本时使用

http.setRequestProperty("Referer", downUrl.toString()); //包含用户访问当前请求页面的URL。

http.setRequestProperty("字符集", "UTF-8"); //字符集

int startPos=块* (threadId - 1) + downLength; //起始位置

int endPos=块* threadId - 1; //结束位置

http.setRequestProperty("范围", "字节=" + startPos + "-"

+ endPos);//设置获取实体数据的范围

//浏览器类型,如果Servlet返回的内容与浏览器类型相关,这个值非常有用。

http.setRequestProperty(

"用户代理",

"Mozilla/4.0(兼容;MSIE 8.0;Windows NT 5.2;Trident/4.0;NET CLR 1.1.4322;NET CLR 2.0.50727;NET CLR 3.0.04506.30;NET CLR 3.0.4506.2152;NET CLR 3.5 .30729)");

http.setRequestProperty("连接", "保持活动"); //设置为持久连接

//获取输入流

输入流inStream=http.getInputStream();

字节[]缓冲区=新字节[1024];

整数偏移量=0;

print("线程" + this.threadId

+ " 从位置开始下载" + startPos);

//随机访问文件

RandomAccessFile 线程文件=new RandomAccessFile(

this.saveFile, "rwd");

//定位到pos位置

threadfile.seek(startPos);

while (!downloader.getExit()

(offset=inStream.read(buffer, 0, 1024)) !=-1) {

//写入文件

threadfile.write(缓冲区, 0, 偏移量);

downLength +=偏移量; //累计下载大小

downloader.update(this.threadId, downLength); //更新指定线程的最后下载位置

下载器.append(偏移量); //累计下载大小

}

线程文件.close();

inStream.close();

print("线程" + this.threadId + "下载完成");

this.finish=true;缓存每个线程的下载长度

映射日志数据=文件服务

.getData(downloadUrl);//获取下载记录

/* 缓存每个线程的下载长度*/

私有Mapdata=new ConcurrentHashMap();

for (Map.Entryentry : logdata.entrySet()) //entrySet() 获取对象

data.put(entry.getKey(),entry.getValue());//将每个线程已经下载的数据长度放入data中获取文件名,获取连接中最后一个“/”后面的或者从HeaderField 获取

私有字符串getFileName(HttpURLConnection conn) {

字符串文件名=this.downloadUrl.substring(this.downloadUrl

.lastIndexOf("/") + 1);

if (filename==null || "".equals(filename.trim())) {//如果无法获取文件名

for (int i=0; i++) {

字符串我的=conn.getHeaderField(i);

如果(我的==空)

休息;

//content-disposition 是当用户想要将请求的内容保存为文件时提供一个默认的文件名。

if ("内容处置".equals(conn.getHeaderFieldKey(i)

.toLowerCase())) {

//匹配字段获取文件名、正则表达式

匹配器m=Pattern.compile(".*filename=(.*)").matcher(

我的.toLowerCase());

if (m.find())

返回m.group(1);

}

}

文件名=UUID.randomUUID() + ".tmp"; //默认是文件名

}

返回文件名;

}标题的内容配置

也就是说,当用户想要将请求的内容保存为文件时,提供默认文件名。

就像使用计算机时一样,弹出窗口允许用户使用默认名称保存内容。

如果在计算机上使用,服务器要做的事情:

1、代码中使用Content-Disposition时,保证浏览器弹出下载对话框。

response.addHeader("内容处置","附件");请务必确保您没有执行任何禁用浏览器缓存的操作。如下:

response.setHeader("Pragma", "无缓存");

response.setHeader("缓存控制", "无缓存");

response.setDateHeader("过期", 0);

JAVA正则表达式模式和匹配器

随机访问文件类RandomAccessFile

我觉得简单来说就是一个分段下载或者断点下载的分段类,可以看成是节点流。

//随机访问文件

RandomAccessFile 线程文件=new RandomAccessFile(

this.saveFile, "rwd");

//定位到pos位置

threadfile.seek(startPos);剪切文件并以与剪切字符串类似的方式打印字符串。

白纸练习

|123456789|123456789|123456789|

1 条记录2 条记录3 条记录

//练习随机访问文件类

导入java.io.*;

班级学生

{

字符串名称="aaaaaaa";

整数年龄=0;

公共静态最终int LEN=8;

公共学生(字符串n,int a)

{

if(n.length( )LEN)

{

n=n.substring(0,LEN);

}

if(n.length()多线程分段下载的含义:

网速和带宽是一定的,那么为什么多线程下载可以加速呢? (TCP单流很难利用全带宽)

https://www.zhihu.com/question/19914902

F2 AS 跳转到错误处

Q: RandomAccessFile中的mode、rws、rwd有什么区别?

A:

先写这个多线程分段下载

我的脚步就是这样,由浅入深

1 我先写了一个下载

2 编写单线程下载+暂停

3 最后写多线程下载+暂停

瓶颈:

类的方法分类,比如一个是线程类,一个是下载器类。目前尚不清楚线程类处理什么以及下载器处理什么。

收成:

想法非常重要

是的,单线程下载+暂停

首次下载 获取httpurlConnection,connect,获取输入流,创建本地文件,设置缓冲区大小, 每次将缓冲的数据写入文件,记录暂停的位置,插入数据库

SqlCreater sqlCreater=new SqlCreater(GetNetworkSize.this);

DbOperator dbOperator=new DbOperator(sqlCreater.getWritableDatabase());

HttpURLConnection urlConnection=Network.urlConnection(apkpath);

如果(是第一个){

isFirst=假;

尝试{

输入流in=urlConnection.getInputStream();

apksize=urlConnection.getContentLength()+"";

文件=新文件(apkpath);

FileOutputStream fo=new FileOutputStream(文件);

byte[]b=新字节[1024];

整数行=0;

while ((line=in.read())!=-1){

fo.write(b,0,行);

当前Apksize+=行;

//第一次下载是添加

dbOperator.add(1,当前Apksize);

p=(浮点) currentApksize/(浮点) Integer.valueOf(apksize) * 100;

pro=(int) p;

handler.sendEmptyMessage(SINGLEDOWN);

}

fo.close();

附寄();

} catch (IOException e) {

e.printStackTrace();

}

}

别的{

//第二次下载是更新数据库内容,向服务器请求进度,并获取保存的文件,根据进度随机访问文件下载。

int startpos=dbOperator.getCurrentApkSize("multidownload");

尝试{

URL url=新URL(apkpath);

HttpURLConnection conn=(HttpURLConnection) url.openConnection();

conn.setRequestMethod("GET");

conn.setReadTimeout(5000);

conn.setRequestProperty("范围","byte="+startpos+"-"+apksize);

InputStream is=conn.getInputStream();

RandomAccessFile continuefile=new RandomAccessFile(file,"rwd");

byte[]b=新字节[1024];

整数行=0;

while ((line=is.read())!=-1){

continuefile.write(b,0,行);

当前Apksize+=行;

handler.sendEmptyMessage(SINGLEDOWN);

}

is.close();

} catch (IOException e) {

e.printStackTrace();

}

dbOperator.update(1,当前Apksize);

}

好了,文章到此结束,希望可以帮助到大家。

用户评论

为爱放弃

终于有专门下载服务器文件的工具啦!这个功能对我来说简直太棒了。

    有6位网友表示赞同!

独角戏°

在线下载好方便啊!不用再自己弄复杂的操作了。

    有10位网友表示赞同!

开心的笨小孩

5.31上线? 我要赶紧试试看这新版本的软件!

    有17位网友表示赞同!

烬陌袅

断点续传真的必备功能啊,之前没下载成功的时候很恼火过几次。

    有9位网友表示赞同!

你瞒我瞒

多线程分段下载能大大缩短下载时间,厉害了!

    有5位网友表示赞同!

折木

应用及通知栏显示进度条很人性化,这样可以随时了解下载情况,不用担心卡顿。

    有15位网友表示赞同!

微信名字

这个下载工具支持服务器文件?那以后我就不需要折腾各种下载器了!

    有10位网友表示赞同!

炙年

多线程分段下载能省不少时间啊!特别是对于大型文件的下载。

    有12位网友表示赞同!

微信名字

之前下载服务器文件常常遇到文件损坏和下载速度慢的问题,希望这个新工具能够解决这些问题。

    有18位网友表示赞同!

艺菲

这功能太贴心了,以后下载文件就不会手忙脚乱了。

    有15位网友表示赞同!

减肥伤身#

不知道支持哪些类型的服务器文件啊?我试一试看看能用。

    有17位网友表示赞同!

不要冷战i

终于不用再在下载界面等着了,进度条和通知栏真方便。

    有8位网友表示赞同!

(り。薆情海

看起来这个软件功能很强大啊!期待体验一下真实情况。

    有11位网友表示赞同!

泪湿青衫

有了这新工具,我想我的下载体验会大大的提高!

    有16位网友表示赞同!

莫失莫忘

下载服务器文件是经常需要做的工作,希望这个工具能够效率和稳定性。

    有11位网友表示赞同!

一笑抵千言

对于很多使用服务器文件的用户来说,这个新功能相当实用。

    有17位网友表示赞同!

封锁感觉

以前下载服务器文件总是很累赘的,现在终于有了更 convenient 的方式!

    有5位网友表示赞同!

你是梦遥不可及

我猜想这软件一定会受到广大用户的追捧!

    有17位网友表示赞同!

猫腻

希望能支持更多类型的服务器文件下载!

    有15位网友表示赞同!

墨城烟柳

期待以后这个工具能够升级的功能!

    有15位网友表示赞同!

【5月31日至6月3日:高效在线下载服务器文件,支持应用内进度显示与断点续传功能】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:探寻经典老歌之美:跨越时空的音乐之旅 下一篇:手表复刻价格概览:复刻表市场价位全解析