2019独角兽企业重金招聘Python工程师标准>>>

上篇文章提到了向服务器请求部分数据,已达到多线程下载的目的。

这里我们看看如何实现多线程写入文件。先看示例代码:

String url="";//待下载文件网络地址
String path="";//待下载文件本地地址
int startpos,endpos;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
//request.Timeout = Timeout.Infinite;
request.Timeout = 30000;
request.AddRange(startpos,endpos); //采用 http 协议的 Range 头,下载部分数据
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{using (Stream sReader = response.GetResponseStream()){using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write)){// 打开下载文件,共享写,注意每个线程写的时候从规划好的位置开始,不然会覆盖while (len > 0){byte[] buffer = new byte[10240];int read = sReader.Read(buffer, 0, buffer.Length);if (read <= 0){break;}fs.Seek(startpos, SeekOrigin.Begin);//开始写的位置fs.Write(buffer, 0, read);fs.Flush();UpdateStartPos(id, read);//更新待下载文件已下载数据量,id为当前下载文件标志len -= read;}}}
}

这里我们看看这几个点:

1.request.AddRange(start,end)。添加head头,请求部分数据。

2.FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write))。打开文件流,共享写,实现多线程写入文件。但是要注意,多线程写入的时候,规划好每个线程写入的其实位置和request添加Range头的位置对应,避免写入文件覆盖数据。fs.Seek(start,SeekOrigin.Begin)

3.那么如何知道这个起始位置呢?

迅雷之前的版本在下载的时候会创建一个下载文件对应的cfg文件,这个cfg文件就是下载文件下载过程中的状态文件,例如当前下载线程数,每个线程起始位置,当前每个线程下载量和总下载量等。下载的同时会实时写入这个配置文件,更新下载状态。在下次启动时,加载这个cfg文件达到上次下载的结束状态,以便开始下载。

这里我们为了方便写入文件同时更新下载进度,我们以10k为单位下载数据写入文件,同时写入配置文件。注意代码中:UpdateStartPos(id, read);//更新待下载文件已下载数据量,id为当前下载文件标志。

这样就实现了多线程写入,断点功能。

这里注意,UpdateStartPos(id, read) 方法,在更新配置文件的时候会有cfg文件锁定的问题。

4. ReaderWriterLock 锁

更新cfg配置文件的时候采用读写锁。在.Net Framework 4 中建议采用ReaderWriterLockSlim。

对于所有新的开发建议使用 ReaderWriterLockSlim。 ReaderWriterLockSlim 类似于 ReaderWriterLock,但简化了递归规则以及升级和降级锁定状态的规则。 ReaderWriterLockSlim 可避免多种潜在的死锁情况。 此外,ReaderWriterLockSlim 的性能明显优于 ReaderWriterLock。

private ReaderWriterLockSlim  _mutex = new ReaderWriterLockSlim();
public readonly int ReaderWriterLockTimeout = 30000;
public void UpdateStartPos(int taskid, int increment)
{if(_mutex.TryEnterWriteLock(ReaderWriterLockTimeout)){try{// 更新配置文件,可以是xml txt 甚至数据库,但尽可能是个短时间操作}finally{_mutex.ExitWriteLock();}}}

转载于:https://my.oschina.net/congqian/blog/135782

多线程断点下载开发总结(二)- 多线程写文件相关推荐

  1. (Android小应用)在Android中实现多线程断点下载(连载二)

    前面已经讲了通过多线程下载网络文件的一部分核心代码,下面继续做我们的项目 当然如果我们做小一点的Android项目的时候可以先做界面,然后根据需要来扩展所需要的功能,当然有的时候我们宁愿先实现业务,业 ...

  2. iOS开发网络篇—多线程断点下载

    iOS开发网络篇-多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始, ...

  3. Java多线程断点下载

    多线程下载已经提高了下载的效率,但是当一些特殊情况发生的时候,我们需要对程序进行处理,这样效率会更高.比如,断电断网等造成下载中断,那么我们下一次又要重新开始下载,这样效率底下,所以我们可以考虑使用断 ...

  4. android 多线程断点下载,listview 模式 开始 暂停等功能

    android 多线程断点下载,listview 模式 代码依次如下: 布局: <?xml version="1.0" encoding="utf-8"? ...

  5. 安卓客户端的多线程断点下载(SharedPreferences版)

    题记:从百度百科上面我们知道,SharedPreferences是不支持多线程的,但是这次使用SharedPreferences实现了多线程断点下载.点解? 服务器端: 使用的是tomcat服务器,在 ...

  6. android学习笔记---31_多线程断点下载器,下载原理实现

    1.1.31_多线程断点下载器 ----------------------- 1.软件界面:   文件下载路径              text框   button 下载   点击后,下面显示下载 ...

  7. 即拿即用-Android多线程断点下载

    线程下载只需要确定好下载一个文件需要多少个线程,一般来说最好为3条线程,因为线程过多会占用系统资源,而且线程间的相互竞争也会导致下载变慢. 其次下载的时候将文件分割为三份(假设用3条线程下载)下载,在 ...

  8. Android 多线程断点下载demo实现

    先来一张效果图: 主要实现思路: 每一个下载都是通过RandomAccessFile对下载资源的总长进行切割之后,根据我们设置的线程多少进行计算之后开启多线程下载的.而每一个任务都是一个AsyncTa ...

  9. Android多线程断点下载

    到华为后,信息管理特别严格,文件不能外发.所以好久都没写博客了,今天周日,老婆非要我学习.就闲来无事,写一篇博客,呵呵-- 前段时间,项目中提到了断点下载apk并静默安装的需求.本打算用应用市场成熟的 ...

最新文章

  1. AI还原宋明清三朝皇帝,还找到了最匹配的明星脸,网友:四大美女安排上
  2. P5367 【模板】康托展开
  3. OceanBase首次阐述战略:继续坚持自研开放之路 开源300万行核心代码
  4. spark之2:原理介绍
  5. 闲谈神经网络--写给初学者(三)
  6. 安卓 spinner下拉框 做模糊查询_SEO数据查询工具
  7. 双系统win7时间造8小时问题的解决
  8. 【搜索-剪枝-偏难】PAT-天梯赛-L3-015. 球队“食物链”
  9. java 反射如何给属性赋值_关于Java属性反射的异常问题
  10. git 删除历史记录
  11. 小时候玩过的游戏之八——玻璃弹珠
  12. js中的entries方法的使用
  13. 如何选择合适的RFID标签
  14. php卡片式,50+创意卡片式网站欣赏
  15. win10wifi间歇性断网重启后恢复_如何解决win10无线网间歇性掉线
  16. verilog练习:hdlbits网站上的做题笔记(5)
  17. if 判断条件为纯数字
  18. 下载360图片(一)
  19. Ubuntu18.04连蓝牙键盘后,搜狗输入法导致输入卡顿问题(六十二)
  20. 区块链技术开发的常备语言总结

热门文章

  1. spark重要端口号
  2. python判断CSV文件是否空
  3. 命令模式的优点?_一篇目录复习完设计模式
  4. 枚举保存到数据库中为序号解决方案
  5. python网络信息提取_python网络爬虫与信息提取I
  6. pandas describe函数_PANDAS: 新手教程 一
  7. 信鸽 ios tag推送 php,iOS 关于信鸽推送点击推送通知的处理
  8. android dimensions.xml,[Android Studio #2] 操作資源XML檔
  9. 网线传输速度测试_弱电工程CAT5eCAT6CAT6aCAT7网线怎么选择
  10. rehl7.3部署K8s集群