前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传。

     在实际开发中,输入输出流用的比较少,但是用起来也是很方便的。iOS开发用到的输入输出流和在Java中的输入输出流是几乎一样的,本质也是一个意思:将网络返回的数据当做流来处理。

     输入输出的理解:输入到哪里?输出到哪里?这个问题不难理解,输入输出是要站着服务器角度来思考的,下面用图来解释:

    

代码关键词:

   1、在接收到响应头的代理方法里创建输出流(根据上面的图,下载自然需要创建输出流NSOutputStream)。

    

     2、在接收数据的代理方法中写(write)数据,注意写入的是data字节(data.bytes)。

    

   3、最后在下载完毕的代理方法里关闭输出流。

   

用来做代码练习的API接口:

MP4小视频:http://120.25.226.186:32812/resources/videos/minion_01.mp4

完整的关键代码:

 #import "ViewController.h"

 @interface ViewController ()
@property (nonatomic ,assign)NSInteger totalSzie;
@property (nonatomic ,assign)NSInteger currentSzie;
@property (nonatomic, strong) NSString *fileName;
/** 文件的路径*/
@property (nonatomic ,strong) NSString *fullPath;
/** 请求对象*/
@property (nonatomic ,strong)NSURLConnection *connect;
/** 输出流*/
@property (nonatomic ,strong)NSOutputStream *stream;
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
@end @implementation ViewController
#pragma mark ----------------------
#pragma mark Events
- (IBAction)downloadBtnClick:(id)sender
{ // [[NSFileManager defaultManager] removeItemAtPath:self.fullPath error:nil]; [self download];
}
- (IBAction)cancelBtnClick:(id)sender
{
//取消网络请求
[self.connect cancel];
} #pragma mark ----------------------
#pragma mark Methods
-(void)download
{
NSLog(@"------");
//1.确定url
NSURL *url =[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_01.mp4"]; //2.创建请求对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //设置请求头信息,说明只需要请求该资源的一部分数据
/*
bytes=0-1000 表示下载0~1000的数据
bytes=0- 表示从0开始下载直到下载完毕
bytes=100- 表示从0开始下载直到下载完毕
*/
NSString *range = [NSString stringWithFormat:@"bytes=%zd-",self.currentSzie];
[request setValue:range forHTTPHeaderField:@"Range"];
NSLog(@"%@",range); //3.发送异步请求
self.connect = [NSURLConnection connectionWithRequest:request delegate:self];
} #pragma mark ----------------------
#pragma mark NSURLConnectionDataDelegate
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"--didReceiveResponse-"); //判断是否已经下载过了
if (self.currentSzie >) {
return;
} //0.获得文件的总大小
//expectedContentLength是本次请求的数据的大小,并不是整个
self.totalSzie = response.expectedContentLength; //1.得到文件的名称
self.fileName = response.suggestedFilename; //2.获得文件的全路径
//caches
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; NSString *fullPath = [caches stringByAppendingPathComponent:self.fileName];
self.fullPath = fullPath; //3.创建输出流
/*
第一个参数: 写入数据的地址
第二个参数: 表示要不要追加 断点续传肯定要追加
*/
NSOutputStream *stream = [[NSOutputStream alloc]initToFileAtPath:fullPath append:YES];
self.stream = stream; //4.打开数据流
// 如果文件不存在,那么会自动创建一个空的文件
[self.stream open];
} -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
//写数据
/*
第一个参数:要写的数据
第二个参数:数据的长度
*/
[self.stream write:data.bytes maxLength:data.length]; //3.累加当前下载的数据大小
self.currentSzie +=data.length; //4.计算文件的下载进度
NSLog(@"%f",1.0 * self.currentSzie / self.totalSzie); self.progressView.progress = 1.0 * self.currentSzie / self.totalSzie;
} -(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"%@",self.fullPath); //1.关闭输出流
[self.stream close]; //2.清空指针
self.stream = nil;
} -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
} @end

iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄的更多相关文章

  1. iOS开发之网络编程--使用NSURLConnection实现大文件下载

    主要思路(实现下载数据分段写入缓存中) 1.使用NSURLConnectionDataDelegate以及代理方法.2.在成功获取响应的代理方法中,获得沙盒全路径,并在该路径下创建空文件和文件句柄.3 ...

  2. iOS开发之网络编程--使用NSURLConnection实现文件上传

    前言:使用NSURLConnection实现文件上传有点繁琐.    本文并没有介绍使用第三方框架上传文件. 正文: 这里先提供用于编码测试的接口:http://120.25.226.186:3281 ...

  3. iOS开发之网络编程--小文件下载

    文件下载方式: 如果下载的文件比较小,下载方式: 直接用NSData的 +(id)dataWithContentsOfURL:(NSURL*)url; 利用NSURLConnection发送一个HTT ...

  4. iOS开发之网络编程--5、NSURLSessionUploadTask+NSURLSessionDataDelegate代理上传

    前言:关于NSURLSession的主要内容快到尾声了,这里就讲讲文件上传.关于文件上传当然就要使用NSURLSessionUploadTask,这里直接讲解常用的会和代理NSURLSessionDa ...

  5. iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>

    前言:根据前篇<iOS开发之网络编程--2.NSURLSessionDownloadTask文件下载>或者<iOS开发之网络编程--3.NSURLSessionDataTask实现文 ...

  6. iOS开发之网络编程--3、NSURLSessionDataTask实现文件下载(离线断点续传下载)

    前言:使用NSURLSessionDownloadTask满足不这个需要离线断点续传的下载需求,所以这里就需要使用NSURLSessionDataTask的代理方法来处理下载大文件,并且实现离线断点续 ...

  7. iOS开发之网络编程--2、NSURLSessionDownloadTask文件下载

    本文内容大纲: 1.回顾NSURLSessionTask 2.NSURLSessionDownloadTask大文件之block下载 3.NSURLSessionDownloadTask大文件之代理方 ...

  8. 使用NSURLConnection实现大文件断点下载

    使用NSURLConnection实现大文件断点下载 由于是实现大文件的断点下载,不是下载一般图片什么的.在设计这个类的时候本身就不会考虑把下载的文件缓存到内存中,而是直接写到文件系统. 要实现断点下 ...

  9. IOS开发之网络编程--文件压缩和解压缩

    前言: QQ表情包就用到了解压缩,从网络下载的那么多表情文件格式并不是一个一个图片文件,而是多个图片压缩而成的表情压缩包.下面介绍的是iOS开发中会用到的压缩和解压缩的第三方框架的使用. 注意: 这个 ...

随机推荐

  1. HDU4550+贪心

    /* 贪心 先挑出最小的Mm,然后在Mm左侧的按情况考虑,右侧的按顺序排列. */ #include<stdio.h> #include<string.h> #include& ...

  2. iOS-设计模式-懒加载

    一.为什么要懒加载? 答: iPhone设备内存有限,如果在程序在启动后就一次性加载将来会用到的所有资源,那么久可能会耗尽iOS设备的内存.这些资源例如大量的数据,图片,音频,过多的控件等. 二.懒加 ...

  3. IT人的自我导向型学习:开篇杂谈

    报考大学时,家人让我报的是计算机系,那个时候,普遍都认为读计算机专业的人将来不用愁找不到工作.为何得出这样的结论不得而知,但是在过去三十年中,的确有很多响当当赚了大钱的IT人在影响着我们. 顺利的考取 ...

  4. 仿照微信的效果,实现了一个支持多选、选原图和视频的图片选择器,适配了iOS6-9系统,3行代码即可集成.

    提示:如果你发现了Bug,请尝试更新到最新版.目前最新版是1.6.4,此前的版本或多或少存在一些bug的~如果你已经是最新版了,请留一条评论,我看到了会尽快处理和修复哈~ 关于升级iOS10和Xcdo ...

  5. 谈论XSS

    XSS 叫跨站脚本攻击(Cross Site Script),那么XSS原本应该叫做CSS,但是由于CSS的简称已经被连级样式表 使用了,所以就换个称谓XSS. 为什么叫做跨站脚本攻击呢? 它的意思就 ...

  6. IOS页面自动布局 之 NSLayoutConstraint基础篇

    使用AutoLayout之前需要知道以下两点: 1.必须设置 translatesAutoresizingMaskIntoConstraints为NO. 2.如果是viewControl则AutoLa ...

  7. C语言字符串匹配函数

    C语言字符串匹配函数,保存有需要时可以用: #include <stdio.h> #include <stdlib.h> #include <string.h> # ...

  8. 用SQL语句修复SQL Server数据库

    使用数据库的过程中,由于断电或其他原因,有可能导致数据库出现一些小错误,比如检索某些表特别慢,查询不到符合条件的数据等. 出现这些情况的原因,往往是因为数据库有些损坏,或索引不完整. 在ACCESS中 ...

  9. Spring 接口代理 类代理

    1.Question Description : when you use @Transactional annotation and @RequiresPermissions annotation ...

  10. mvc设计模式和mvc框架的区别

    Spring中的新名称也太多了吧!IOC/DI/MVC/AOP/DAO/ORM... 对于刚刚接触spring的我来说确实晕了头!可是一但你完全掌握了一个概念,那么它就会死心塌地的为你服务了.这可比女 ...