美文网首页
iOS之实现大文件下载存储的操作方式

iOS之实现大文件下载存储的操作方式

作者: 枫叶无处漂泊 | 来源:发表于2019-12-28 13:53 被阅读0次

    前言

    最近在整理梳理断点续传的功能,查看了许多关于大文件存储实现的方式。梳理一下它们的特点。

    实现文件存储的三种方式

    • NSMutableDdata方式拼接

    • NSFileHandle

    • NSOutputStream

    NSMutableDdata

    当下载大文件时候,我们是通过代理回调,一点一点获取数据。如果使用NSMutableDdata拼接数据,会使得内存暴增。所以不能使用NSMutableDdata拼接数据保存

    #pragma mark - <NSURLSessionDataDelegate> 实现方法
    
    @property (nonatomic, strong)NSMutableData *fileData;
    
    /**
     * 接收到具体数据:把数据写入沙盒文件中
     */
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
    
        // 每次下载的data存储到fileData中,会导致内存暴涨    [self.fileData appendData:data];
    }
    
    

    NSFilehandle

    该类就是专门用于操作文件(handle),下载大文件的操作步骤。

    //1.获取每次从服务器获取的data
    
    //2.沙盒文件路径
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] 
    stringByAppendingPathComponent:@"yyy.mp4"];
    
    //3.没有文件创建一个文件
    NSFileManager *manager = [NSFileManager defaultManager];
    if (![manager fileExistsAtPath:path]) {
        //创建一个空的文件
        [manager createFileAtPath:path contents:nil attributes:nil];
    }
    
    // 4、创建文件句柄,设置句柄写数据的位置(追加)
    NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:path];
    [fileHandle seekToEndOfFile];
    
    //5.向沙盒指定文件写入数据
    [fileHandle writeData:data];
    
    //6.当下载完成之后,文件文件句柄
    [fileHandle closeFile];
    fileHandle = nil;
      
    

    NSOutputStream

    NSStream是一个抽象类和NSOperation一样是用来约束子类的,NSOutputStream就是NSStream的一个子类.

    NSOutputStream这个就是输出流就像一个集合,往里面加数据就好了,其实网络在传输数据的话都是以一个二进制流的方式进行传递的。

    //1.获取每次从服务器获取的data
    
    //2.沙盒文件路径
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] 
    stringByAppendingPathComponent:@"yyy.mp4"];
    
    //3.创建并打开数据流
    /*
        第一个参数:二进制的流数据要写入到哪里(没有就创建,有就直接写入,不用自己创建文件)
        第二个参数:采用什么样的方式写入流数据,如果YES则表示追加,如果是NO则表示覆盖
    */
    NSOutputStream *outputStream = [NSOutputStream outputStreamToFileAtPath:fullPath append:YES];
    [outputStream open];
    
    //4.使用输出流写数据
    /*
        第一个参数:二进制数据流
        第二个参数:要写入的数据的大小
    */
    [outputStream write:data.bytes maxLength:data.length];
    
    //关闭输出流
    [outputStream close];
    outputStream = nil;
    
    

    总结

    • 不建议使用NSMutableData存储大文件数据,会使内存暴涨。

    • NSOutputStream与NSFileHandle区别:

      • NSOutputStream不用判断是否有这个路径文件,如果没有就自动创建,有的话直接写入数据。
      • NSOutputStream写进的是二进制流:data.bytes,NSFileHandle写进的是二进制数据:data

    相关文章

      网友评论

          本文标题:iOS之实现大文件下载存储的操作方式

          本文链接:https://www.haomeiwen.com/subject/ukdsoctx.html