01、沙盒機制及簡單對象的寫入和讀取

一、什么是沙盒(SandBox)

1、每一個iOS應(yīng)用程序都會為自己創(chuàng)建一個文件系統(tǒng)目錄(相當(dāng)于一個文件夾),這就是沙盒。
這里需要注意的就是應(yīng)用程序每運行一次,沙盒文件名稱就會發(fā)生改變。
2、應(yīng)用程序沙盒路徑
點擊桌面空白處==>點擊前往==>同時按住Alt鍵==>選中資源庫==>如下操作就可以找到該應(yīng)用程序的沙盒路徑了。




二、什么是沙盒機制

1、iOS中的沙盒機制是一種安全體系。
2、它規(guī)定了應(yīng)用程序只能在為該應(yīng)用程序創(chuàng)建的文件夾(沙盒)內(nèi)訪問文件,不可以訪問其他沙盒內(nèi)的內(nèi)容(在iOS8之后已經(jīng)部分開始訪問)。
3.所有的非代碼文件都保存在這個地方,比如圖片、聲音、屬性列表(plist)、sqlite數(shù)據(jù)庫和文本文件等。

特點
  • 每個應(yīng)用程序的活動范圍都限定在自己的沙盒里
  • 不能隨意跨越自己的沙盒去訪問別的應(yīng)用程序沙盒中的內(nèi)容(在iOS8之后已經(jīng)部分開始訪問)。
  • 應(yīng)用程序向外請求或接收數(shù)據(jù)都需要經(jīng)過權(quán)限認(rèn)證,例如定位、麥克風(fēng)、相冊等訪問權(quán)限。

三、應(yīng)用程序的沙盒目錄

應(yīng)用程序的沙盒目錄下會有三個文件夾Documents、Library、tmp


  • Documents:????????????????????????????????????????????????????????????????????????保存應(yīng)用運行時生成的需要持久化的數(shù)據(jù),iTunes不會自動備份該目錄。
  • Library:存儲程序的默認(rèn)設(shè)置和其他狀態(tài)信息,iTunes會自動備份該目錄。
    Library/Caches:存放緩存文件,iTunes不會備份此目錄,此目錄下的文件不會再應(yīng)用退出后刪除,一般存放體積比較大,不是特別重要的資源。
    Library/Preferences:保存應(yīng)用的所有偏好設(shè)置,iOS的settings應(yīng)用會在該目錄中查找應(yīng)用的設(shè)置信息,iTunes會自動備份該目錄。
  • tmp:保存應(yīng)用運行時的臨時數(shù)據(jù),使用完畢后再將相應(yīng)的文件從該目錄刪除,應(yīng)用沒有運行時,系統(tǒng)也有可能清除該目錄下的文件,iTunes不會自動備份該目錄。iphone重啟時,該目錄下的文件會被刪除,為了安全起見,我們不會把數(shù)據(jù)存放到tem中。

四、如何獲取沙盒路徑、Documents目錄、 Library目錄、tmp目錄

  • 獲取沙盒路徑
//沙盒的主路徑
 NSString* homePathString=NSHomeDirectory();
  • 獲取Documents目錄

 //documents路徑
    //第一個參數(shù):要找尋的目標(biāo)文件
    //第二個參數(shù):查找的范圍(要找尋的目標(biāo)文件夾的父級文件夾)
    //第三個參數(shù):文件路徑是否展開
    NSArray* documentsArray=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* documentPath=documentsArray.firstObject;
  • 獲取Library目錄
//Library路徑
    NSArray* libraryArray=NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSString* libraryPath=libraryArray.firstObject;
    NSLog(@"libraryPath---%@",libraryPath);
    //caches路徑
    NSArray* cacheArray=NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString* cachesPath=cacheArray.firstObject;
    NSLog(@"cachesPath----%@",cachesPath);
    //preference路徑
    NSString* preferencePath=[libraryPath stringByAppendingString:@"/preferences"];
    NSLog(@"preferencePath----%@",preferencePath);
  • 獲取tmp目錄
 //tmp路徑
    NSString* tmpPath=NSTemporaryDirectory();

五、簡單對象的讀取操作

1、NSString的寫入

#pragma mark------文件的寫入
-(void)writeToFile{
    //將一段字符串寫入documents文件夾中
    NSString* documentsPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    //在上面的路徑下創(chuàng)建一個文件路徑用來盛放文字
    NSString* txtPath=[documentsPath stringByAppendingPathComponent:@"string.txt"];
    //將文字寫入文件中,當(dāng)文字寫入文件的時候,如果文件不存在,系統(tǒng)會先創(chuàng)建,在寫入;如果存在,直接寫入。新的內(nèi)容會將原來的內(nèi)容覆蓋掉
    NSString* contentStr=@"我是文本內(nèi)容";
    //寫入操作
    //第一個參數(shù):文件路徑
    //第二個參數(shù):原子性 YES:在寫入過程中會產(chǎn)生一個臨時文件,當(dāng)內(nèi)容寫入完整的時候,才會將內(nèi)容移動到目標(biāo)文件中  NO:直接在目標(biāo)文件上操作,不產(chǎn)生臨時文件,有可能損壞目標(biāo)文件
    //第三個參數(shù):字符串的編碼格式
    //第四個參數(shù):如果寫入出問題,這里會產(chǎn)生一個錯誤日志,一般不需要錯誤日志,直接賦值為nil
    //error對象用來保存錯誤日志
    NSError* error=nil;
    BOOL isSuccsess=[contentStr writeToFile:txtPath atomically:YES encoding:(NSUTF8StringEncoding) error:&error];
    //只知道寫入的結(jié)果,沒有失敗過程描述
    if (isSuccsess) {
        NSLog(@"成功");
    }else{
        NSLog(@"失敗");
    }
    
}

運行后會在documents文件下顯示此文本,在這里我們也可以將文本格式改為.plist,它就會以xml格式存在。無論文本的后綴名是什么,我們都可以用文本編輯的方式打開,所以有時候,png不一定是圖片,也有可能是文本或其他格式。


屏幕快照 2016-12-07 下午8.54.32.png

屏幕快照 2016-12-07 下午9.00.12.png

2、NSString的讀取


#pragma mark------文件的讀取
-(void)readFile{
    //要讀取文件的路徑
    NSString* docPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    NSString* txtPath=[docPath stringByAppendingPathComponent:@"string.txt"];
    //讀取文件
    NSString* readStr=[NSString stringWithContentsOfFile:txtPath encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"我是讀出來的---%@",readStr);
}

同理,其他類型的數(shù)據(jù)寫入和讀取的時候都是類似的,只是方法不同而已,下面是幾種數(shù)據(jù)寫入和讀取的方法


屏幕快照 2016-12-07 下午9.14.28.png

3、相對于以上幾種NSData會比較特殊些,例如圖片的寫入

#pragma mark------圖片的寫入
-(void)imgWriteToFile{
    //document路徑
    NSArray* pathArray=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    //在上面的路徑下創(chuàng)建一個文件路徑用來盛放圖片
    NSString* docPath=pathArray.firstObject;
    NSString* imgPath=[docPath stringByAppendingString:@"/333.png"];
    //圖片寫入
    //將圖片轉(zhuǎn)換為NSData類型
    UIImage* img=[UIImage imageNamed:@"10.JPG"];
    NSData* imgData=UIImageJPEGRepresentation(img, 1.0);
    [imgData writeToFile:imgPath atomically:YES];
    
}

屏幕快照 2016-12-07 下午9.20.24.png

以上幾種方法均要在ViewDidLoad中調(diào)用才可以實現(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容