iOS之實現(xiàn)大文件下載存儲的操作方式

前言

最近在整理梳理斷點續(xù)傳的功能,查看了許多關(guān)于大文件存儲實現(xiàn)的方式。梳理一下它們的特點。

實現(xiàn)文件存儲的三種方式

  • NSMutableDdata方式拼接

  • NSFileHandle

  • NSOutputStream

NSMutableDdata

當下載大文件時候,我們是通過代理回調(diào),一點一點獲取數(shù)據(jù)。如果使用NSMutableDdata拼接數(shù)據(jù),會使得內(nèi)存暴增。所以不能使用NSMutableDdata拼接數(shù)據(jù)保存

#pragma mark - <NSURLSessionDataDelegate> 實現(xiàn)方法

@property (nonatomic, strong)NSMutableData *fileData;

/**
 * 接收到具體數(shù)據(jù):把數(shù)據(jù)寫入沙盒文件中
 */
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {

    // 每次下載的data存儲到fileData中,會導致內(nèi)存暴漲    [self.fileData appendData:data];
}

NSFilehandle

該類就是專門用于操作文件(handle),下載大文件的操作步驟。

//1.獲取每次從服務(wù)器獲取的data

//2.沙盒文件路徑
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] 
stringByAppendingPathComponent:@"yyy.mp4"];

//3.沒有文件創(chuàng)建一個文件
NSFileManager *manager = [NSFileManager defaultManager];
if (![manager fileExistsAtPath:path]) {
    //創(chuàng)建一個空的文件
    [manager createFileAtPath:path contents:nil attributes:nil];
}

// 4、創(chuàng)建文件句柄,設(shè)置句柄寫數(shù)據(jù)的位置(追加)
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:path];
[fileHandle seekToEndOfFile];

//5.向沙盒指定文件寫入數(shù)據(jù)
[fileHandle writeData:data];

//6.當下載完成之后,文件文件句柄
[fileHandle closeFile];
fileHandle = nil;
  

NSOutputStream

NSStream是一個抽象類和NSOperation一樣是用來約束子類的,NSOutputStream就是NSStream的一個子類.

NSOutputStream這個就是輸出流就像一個集合,往里面加數(shù)據(jù)就好了,其實網(wǎng)絡(luò)在傳輸數(shù)據(jù)的話都是以一個二進制流的方式進行傳遞的。

//1.獲取每次從服務(wù)器獲取的data

//2.沙盒文件路徑
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] 
stringByAppendingPathComponent:@"yyy.mp4"];

//3.創(chuàng)建并打開數(shù)據(jù)流
/*
    第一個參數(shù):二進制的流數(shù)據(jù)要寫入到哪里(沒有就創(chuàng)建,有就直接寫入,不用自己創(chuàng)建文件)
    第二個參數(shù):采用什么樣的方式寫入流數(shù)據(jù),如果YES則表示追加,如果是NO則表示覆蓋
*/
NSOutputStream *outputStream = [NSOutputStream outputStreamToFileAtPath:fullPath append:YES];
[outputStream open];

//4.使用輸出流寫數(shù)據(jù)
/*
    第一個參數(shù):二進制數(shù)據(jù)流
    第二個參數(shù):要寫入的數(shù)據(jù)的大小
*/
[outputStream write:data.bytes maxLength:data.length];

//關(guān)閉輸出流
[outputStream close];
outputStream = nil;

總結(jié)

  • 不建議使用NSMutableData存儲大文件數(shù)據(jù),會使內(nèi)存暴漲。

  • NSOutputStream與NSFileHandle區(qū)別:

    • NSOutputStream不用判斷是否有這個路徑文件,如果沒有就自動創(chuàng)建,有的話直接寫入數(shù)據(jù)。
    • NSOutputStream寫進的是二進制流:data.bytes,NSFileHandle寫進的是二進制數(shù)據(jù):data
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 使用NSURLConnection實現(xiàn)下載 1. 小文件下載 第一種方式(NSData) 第二種方式(NSURLC...
    擱淺的青蛙閱讀 2,011評論 3 10
  • 相關(guān)鏈接:https://developer.apple.com/library/archive/document...
    ngugg閱讀 440評論 0 0
  • 流是位數(shù)據(jù)通過通信路徑的連續(xù)傳送序列。它是單向的,從一個應(yīng)用程序的角度,流可以是輸入流(讀操作流)或者輸出流(寫操...
    星捷閱讀 1,226評論 0 2
  • 小文件下載如果文件比較小,下載方式會比較多直接用NSData的+ (id)dataWithContentsOfUR...
    JonesCxy閱讀 748評論 0 1
  • 流提供了一種簡單的方式在不同和介質(zhì)中交換數(shù)據(jù),這種交換方式是與設(shè)備無關(guān)的。流是在通信路徑中串行傳輸?shù)倪B續(xù)的比特位序...
    小魚兒喜歡花無缺閱讀 2,013評論 1 2

友情鏈接更多精彩內(nèi)容