1. 程式人生 > >iOS 大檔案處理,檔案的壓縮和解壓縮

iOS 大檔案處理,檔案的壓縮和解壓縮

5.0 大檔案的下載

(1)實現思路

邊接收資料邊寫檔案以解決記憶體越來越大的問題

(2)核心程式碼


//當接收到伺服器響應的時候呼叫,該方法只會呼叫一次
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    //0.獲得當前要下載檔案的總大小(通過響應頭得到)
    NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
    self.totalLength = res.expectedContentLength
; NSLog(@"%zd",self.totalLength); //建立一個新的檔案,用來當接收到伺服器返回資料的時候往該檔案中寫入資料 //1.獲取檔案管理者 NSFileManager *manager = [NSFileManager defaultManager]; //2.拼接檔案的全路徑 //caches資料夾路徑 NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; NSString
*fullPath = [caches stringByAppendingPathComponent:res.suggestedFilename]; self.fullPath = fullPath; //3.建立一個空的檔案 [manager createFileAtPath:fullPath contents:nil attributes:nil]; } //當接收到伺服器返回的資料時會呼叫 //該方法可能會被呼叫多次 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { //1.建立一個用來向檔案中寫資料的檔案控制代碼
//注意當下載完成之後,該檔案控制代碼需要關閉,呼叫closeFile方法 NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:self.fullPath]; //2.設定寫資料的位置(追加) [handle seekToEndOfFile]; //3.寫資料 [handle writeData:data]; //4.計算當前檔案的下載進度 self.currentLength += data.length; NSLog(@"%f",1.0* self.currentLength/self.totalLength); self.progressView.progress = 1.0* self.currentLength/self.totalLength; }
6.0 大檔案斷點下載

(1)實現思路

在下載檔案的時候不再是整塊的從頭開始下載,而是看當前檔案已經下載到哪個地方,然後從該地方接著往後面下載。可以通過在請求物件中設定請求頭實現。

(2)解決方案(設定請求頭)

//2.建立請求物件
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    //2.1 設定下載檔案的某一部分
    // 只要設定HTTP請求頭的Range屬性, 就可以實現從指定位置開始下載
    /*
     表示頭500個位元組:Range: bytes=0-499
     表示第二個500位元組:Range: bytes=500-999
     表示最後500個位元組:Range: bytes=-500
     表示500位元組以後的範圍:Range: bytes=500-
     */
    NSString *range = [NSString stringWithFormat:@"bytes=%zd-",self.currentLength];
    [request setValue:range forHTTPHeaderField:@"Range"];

(3)注意點(下載進度並判斷是否需要重新建立檔案)

//獲得當前要下載檔案的總大小(通過響應頭得到)
    NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;

    //注意點:res.expectedContentLength獲得是本次請求要下載的檔案的大小(並非是完整的檔案的大小)
    //因此:檔案的總大小 == 本次要下載的檔案大小+已經下載的檔案的大小
    self.totalLength = res.expectedContentLength + self.currentLength;

    NSLog(@"----------------------------%zd",self.totalLength);

    //0 判斷當前是否已經下載過,如果當前檔案已經存在,那麼直接返回
    if (self.currentLength >0) {
        return;
    }
7.0 輸出流

(1)使用輸出流也可以實現和NSFileHandle相同的功能

(2)如何使用

    //1.建立一個數據輸出流
    /*
     第一個引數:二進位制的流資料要寫入到哪裡
     第二個引數:採用什麼樣的方式寫入流資料,如果YES則表示追加,如果是NO則表示覆蓋
     */
    NSOutputStream *stream = [NSOutputStream outputStreamToFileAtPath:fullPath append:YES];

    //只要呼叫了該方法就會往檔案中寫資料
    //如果檔案不存在,那麼會自動的建立一個
    [stream open];
    self.stream = stream;

    //2.當接收到資料的時候寫資料
    //使用輸出流寫資料
    /*
     第一個引數:要寫入的二進位制資料
     第二個引數:要寫入的資料的大小
     */
    [self.stream write:data.bytes maxLength:data.length];

    //3.當檔案下載完畢的時候關閉輸出流
    //關閉輸出流
    [self.stream close];
    self.stream = nil;
8.0 使用多執行緒下載檔案思路
01 開啟多條執行緒,每條執行緒都只下載檔案的一部分(通過設定請求頭中的Range來實現)
02 建立一個和需要下載檔案大小一致的檔案,判斷當前是那個執行緒,根據當前的執行緒來判斷下載的資料應該寫入到檔案中的哪個位置。(假設開5條執行緒來下載10M的檔案,那麼執行緒1下載0-2M,執行緒2下載2-4M一次類推,當接收到伺服器返回的資料之後應該先判斷當前執行緒是哪個執行緒,假如當前執行緒是執行緒2,那麼在寫資料的時候就從檔案的2M位置開始寫入)
03 程式碼相關:使用NSFileHandle這個類的seekToFileOfSet方法,來向檔案中特定的位置寫入資料。
04 技術相關
    a.每個執行緒通過設定請求頭下載檔案中的某一個部分
    b.通過NSFileHandle向檔案中的指定位置寫資料
9.0 檔案的壓縮和解壓縮

(1)說明

使用ZipArchive來壓縮和解壓縮檔案需要新增依賴庫(libz),使用需要包含SSZipArchive檔案,如果使用cocoaPoads來安裝框架,那麼會自動的配置框架的使用環境

(2)相關程式碼

//壓縮檔案的第一種方式
/*
 第一個引數:壓縮檔案要儲存的位置
 第二個引數:要壓縮哪幾個檔案
 */
[SSZipArchive createZipFileAtPath:fullpath withFilesAtPaths:arrayM];

//壓縮檔案的第二種方式
/*
 第一個引數:檔案壓縮到哪個地方
 第二個引數:要壓縮檔案的全路徑
 */
[SSZipArchive createZipFileAtPath:fullpath withContentsOfDirectory:zipFile];

//如何對壓縮檔案進行解壓
/*
 第一個引數:要解壓的檔案
 第二個引數:要解壓到什麼地方
 */
[SSZipArchive unzipFileAtPath:unZipFile toDestination:fullpath];

相關推薦

iOS 檔案處理檔案壓縮和解壓縮

5.0 大檔案的下載 (1)實現思路 邊接收資料邊寫檔案以解決記憶體越來越大的問題 (2)核心程式碼 //當接收到伺服器響應的時候呼叫,該方法只會呼叫一次 -(void)connection:(NSURLConnection *)connect

linux壓縮和解壓縮命令stp本地檔案上傳下載和ssh連線與傳輸

linux 上檔案解壓縮指令 tar命令   解包:tar zxvf FileName.tar   打包:tar czvf FileName.tar DirName      解壓:tar zxvf FileName.tar.gz   壓縮:tar zcvf FileName.

Java ZIP壓縮和解壓縮檔案(解決中文檔名亂碼問題)

Java ZIP壓縮和解壓縮檔案(解決中文檔名亂碼問題) Java ZIP壓縮和解壓縮檔案(解決中文檔名亂碼問題) 學習了:http://www.tuicool.com/articles/V7BBvy  引用原文: JDK中自帶的ZipOutputStream在壓縮檔

檔案管理檔案路徑檔案處理

一.檔案管理 1.新建 (1)新建檔案 touch   student  student1  student2 注意:touch預設用來建立檔案,同時此命令具備修改檔案時間戳功能 (2)新建目錄  mkdir 

利用ZipOutputStream和ZipInputStream實現檔案壓縮和解壓縮

package cn.yimen.archiver.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.ZipEn

go語言基礎語法:異常處理文字檔案處理JSON處理檔案操作

一、異常處理 1.err介面的使用 err1 := fmt.Errorf("%s", "this is normal error") fmt.Println("err1=", err1) err2 := errors.New("this is normal error,

壓縮包解密zip解壓檔案解密找回密碼RAR破解密碼工具壓縮包解密解壓檔案解密檔案軟體RA

壓縮包解密,zip解壓檔案解密,找回密碼,RAR破解密碼工具,壓縮包解密,解壓檔案解密,檔案軟體RAR破解密碼工具免費下載。 目前我見過的最好用的,破解密碼速度最快的軟體,沒有之一,附帶教程,親測好用!!! 下載地址:https://pan.baidu.com/s/1QUwcvwGtwL4StNfSO

利用哈夫曼樹實現檔案壓縮和解壓縮

利用庫中的優先順序佇列實現哈夫曼樹,最後基於哈夫曼樹最終實現檔案壓縮。 描述: 1.統計檔案中字元出現的次數,利用優先順序佇列構建Haffman樹,生成Huffman編碼。 構造過程可以使用priority_queue輔助,每次pq.top

Android中檔案壓縮和解壓縮

使用場景 當我們在應用的Assets目錄中需要加入檔案時,可以直接將原始檔放入,但這樣會造成打包後的apk整體過大,此時就需要將放入的檔案進行壓縮.又如當我們需要從伺服器中下載檔案時,如果下載原始檔耗時又消耗流量,較大檔案需要壓縮,可以使得傳輸效率大大提高.下

Java zip/gzip檔案壓縮和解壓縮

Java IO 為了減少傳輸時的資料量 在Java中提供了專門的壓縮流將檔案或者資料夾壓縮成zip,gzip,jar等檔案形式。 壓縮流實現 Java支援的三種壓縮格式:zip、jar、gzip。 1.zip是一種較為常見的壓縮格式,Java提供了

計算機二級-C語言-程式填空題-190112記錄-結構體的遍歷和結構體的資料的交換處理檔案的操作。

//程式設計題:學生的記錄由學號和成績組成,N名學生的資料已在主函式中放入結構體陣列s中,請編寫函式fun,它的功能是:把分數低的學生資料放在b所指的陣列中,注意:分數最低的學生可能不止一個,函式返回分數最低的學生人數。 //重難點:結構體的定義。結構體的使用。檔案指標的定義。對檔案的操作。輸出格式‘%4d

python檔案處理b模式的讀寫rb, wb編碼的兩種方式

字串轉二進位制的辦法 bytes(字串,encoding='編碼') 字串.encode('編碼') 主要通過這兩種辦法可以讓字串轉為bytes型別 為什麼要用二進位制的讀寫? 因為圖片視訊不是字串方式能顯示的,所以只能用b的方式來. 另外二進位制資料可以跨

檔案ZIp的對byte[]的壓縮和解壓縮

首先: 1、將檔案轉化為byte[]陣列 privatebyte[] getBytesFromFile(File file) throws IOException {         InputStream in = new FileInputStream(file

.tar.xz檔案壓縮和解壓縮

今天下載了一個檔案,壓縮格式是.tar.xz 之前沒遇到過這樣的檔案格式,於是網上搜了下資料: XZ壓縮最新壓縮率之王 xz這個壓縮可能很多都很陌生,不過您可知道xz是絕大數linux預設就帶的一個壓縮工具。 之前xz使用一直很少,所以幾乎沒有什麼提起。

io流複製檔案以及壓縮和解壓縮

import java.io.*; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; public class GzipUtils { public static

Java使用7Zip完成檔案壓縮和解壓縮

有時候,你的程式有可能會做壓縮和解壓縮的操作,當然,你完全可以使用Java自帶的壓縮和解壓縮的工具類來完成,但是那樣也會帶來一些問題:最主要的就是中文亂碼的問題以及保持目錄結構的問題。所以,我們完全可以藉助7Zip來完全檔案的壓縮與解壓縮。 使用Java呼叫7Zip來完

Qt中用QuaZip來壓縮和解壓縮檔案

1、簡介 QuaZIP是使用Qt,C++對ZLIB進行簡單封裝的用於壓縮ZIP以及解壓縮ZIP的開源庫。如果你的Qt專案當中用到了壓縮以及解壓縮ZIP的話你可以考慮選擇使用它。 2、編譯 QuaZip是基於Zlib庫的,編譯前要匯入zlib的標頭檔案,編譯後會生成qua

對於目標檔案系統檔案****過的解決辦法

  FAT32格式只支援4G以下的檔案儲存...超過4G只能是NTFS格式..所以要轉換一下目標盤的格式 點開始再點執行... 用命令:convert [drive:] /fs:ntfs /v [drive:]←輸入要轉換的C盤或D盤其他碟符...

IOS檔案系統檔案管理器

通過一個demo,我們來一起認識一下ios檔案系統。我們一起寫一個檔案管理器。可以查詢檔案,瀏覽目錄,並且可以識別檔案型別,開啟圖片,音訊,視訊等。 首先獲取路徑下的全部檔案路徑 - (void)viewDidLoad { [super viewDi

root使用者下使用git pull檔案時候檔案許可權強制自動變更

在 .git/hooks/ 目錄下 新建一個名為 post-checkout 的檔案 將下列內容儲存 #!/bin/sh pwd echo "This is post-checkout hook" chmod -R 755 ./* && chown -R www