各位老铁们,大家好,今天由我来为大家分享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);
}
好了,文章到此结束,希望可以帮助到大家。
【5月31日至6月3日:高效在线下载服务器文件,支持应用内进度显示与断点续传功能】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于有专门下载服务器文件的工具啦!这个功能对我来说简直太棒了。
有6位网友表示赞同!
在线下载好方便啊!不用再自己弄复杂的操作了。
有10位网友表示赞同!
5.31上线? 我要赶紧试试看这新版本的软件!
有17位网友表示赞同!
断点续传真的必备功能啊,之前没下载成功的时候很恼火过几次。
有9位网友表示赞同!
多线程分段下载能大大缩短下载时间,厉害了!
有5位网友表示赞同!
应用及通知栏显示进度条很人性化,这样可以随时了解下载情况,不用担心卡顿。
有15位网友表示赞同!
这个下载工具支持服务器文件?那以后我就不需要折腾各种下载器了!
有10位网友表示赞同!
多线程分段下载能省不少时间啊!特别是对于大型文件的下载。
有12位网友表示赞同!
之前下载服务器文件常常遇到文件损坏和下载速度慢的问题,希望这个新工具能够解决这些问题。
有18位网友表示赞同!
这功能太贴心了,以后下载文件就不会手忙脚乱了。
有15位网友表示赞同!
不知道支持哪些类型的服务器文件啊?我试一试看看能用。
有17位网友表示赞同!
终于不用再在下载界面等着了,进度条和通知栏真方便。
有8位网友表示赞同!
看起来这个软件功能很强大啊!期待体验一下真实情况。
有11位网友表示赞同!
有了这新工具,我想我的下载体验会大大的提高!
有16位网友表示赞同!
下载服务器文件是经常需要做的工作,希望这个工具能够效率和稳定性。
有11位网友表示赞同!
对于很多使用服务器文件的用户来说,这个新功能相当实用。
有17位网友表示赞同!
以前下载服务器文件总是很累赘的,现在终于有了更 convenient 的方式!
有5位网友表示赞同!
我猜想这软件一定会受到广大用户的追捧!
有17位网友表示赞同!
希望能支持更多类型的服务器文件下载!
有15位网友表示赞同!
期待以后这个工具能够升级的功能!
有15位网友表示赞同!