提到數(shù)據(jù)持久化 我們必須得先了解IOS程序的沙盒機制(sandBox)帝际。
1.IOS沙盒機制介紹
? ? iOS應用程序只能在為該改程序創(chuàng)建的文件系統(tǒng)中讀取文件江滨,不可以去其它地方訪問钓辆,此區(qū)域被成為沙盒滴铅,所以所有的非代碼文件都要保存在此瓮钥,例如圖像底桂,圖標,聲音筋遭,映像搓萧,屬性列表,文本文件等宛畦。
IOS每個應用程序都有自己的三個目錄(Document,Library,tmp),他們只見不能相互訪問揍移。
Document:存放應用程序的數(shù)據(jù) (蘋果建議將程序中建立的或在程序中瀏覽到的文件數(shù)據(jù)保存在該目錄下次和,iTunes備份和恢復的時候會包括此目錄)。
Library:存儲程序的默認設置或其它狀態(tài)信息那伐。
tmp:應用程序存儲臨時文件踏施。
2.IOS沙盒目錄
?2.1 模擬器沙盒目錄
? ? ? ? 首先打開Finder ?然后操作入下圖
因為資源庫該文件是隱藏的,所以沒有開啟查看隱藏文件的朋友可能找不到此文件罕邀。
注:設置查看隱藏文件的方法如下:打開終端畅形,輸入命名
顯示Mac隱藏文件的命令:defaultswritecom.apple.finderAppleShowAllFiles-booltrue
隱藏Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false
繼續(xù)下面
當然還有比較簡單的方法就是直接在finder下 command+shift+g 進入
2.2 真機沙盒目錄
? ? ? 真機和沙盒目錄 根目錄略有不同 我們通過控制臺打印結果來看下
/*獲取程序的Home目錄*/
NSString *homeDirectory = NSHomeDirectory();
NSLog(@"path:%@",?homeDirectory);
模擬器打印結果:2015-03-09 20:29:53.174 JccLibrary[814:37316] path:/Users/jcf/Library/Developer/CoreSimulator/Devices/A1701D58-D1F4-4FF8-898C-0E3DA909D3FE/data/Containers/Data/Application/196D72D5-861A-4B47-AEED-F37FFDA9526A(10.10后可能目錄結構有所不同)
真機結果:2015-03-09 20:38:53.377 JccLibrary[7607:1697173] path:/var/mobile/Containers/Data/Application/CFD1AC59-8F4A-4688-A665-F6381AB4F591
/*獲取Document目錄*/
NSArray*documentArr =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
/*獲取Caches目錄*/
NSArray*cachesArr =NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);
NSString*caches = [cachesArrobjectAtIndex:0];
NSLog(@"\npath-Caches%@", caches);
/* Library目錄*/
NSArray*libraryArr =NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
NSString*library = [libraryArrobjectAtIndex:0];
NSLog(@"\npath-Library%@", library);
/* tem目錄*/
NSString*tmpDir =NSTemporaryDirectory();
NSLog(@"%@", tmpDir);
NSString*document = [documentArrobjectAtIndex:0];
NSLog(@"\npath-Document:%@", document);
3.文件操作
? ? 3.1寫入文件
/*寫入文件*/
NSArray*paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*docDir = [pathsobjectAtIndex:0];
if(!docDir) {
NSLog(@"Documents目錄未找到");
}
NSArray*array =@[@"姓名",@"性別"];
NSString*filePath = [docDirstringByAppendingPathComponent:@"arrayFile.txt"];
NSDictionary*dict =@{@"姓名":@"jcf",@"性別":@"男"};
NSString*dictPath = [docDirstringByAppendingPathComponent:@"dictFile.json"];
[arraywriteToFile:filePathatomically:YES];
[dictwriteToFile:dictPathatomically:YES];
? 3.2 讀取文件
/*讀取文件*/
NSArray*pathss =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*docDirs = [pathssobjectAtIndex:0];
NSString*arrayPaths = [docDirsstringByAppendingPathComponent:@"arrayFile.txt"];
NSArray*arrays = [[NSArrayalloc]initWithContentsOfFile:arrayPaths];
NSString*dictPaths = [docDirsstringByAppendingPathComponent:@"dictFile.json"];
NSDictionary*dicts = [NSDictionarydictionaryWithContentsOfFile:dictPaths];
NSLog(@"array:%@ *** dicts:%@", arrays,dicts);
? 3.3 在Document下創(chuàng)建文件
/*創(chuàng)建文件*/
NSArray*pathsss =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*documentsDirectory = [pathsssobjectAtIndex:0];
NSFileManager*fileManager = [NSFileManagerdefaultManager];
NSString*testDirectory = [documentsDirectorystringByAppendingPathComponent:@"test"];
//創(chuàng)建目錄
[fileManagercreateDirectoryAtPath:testDirectorywithIntermediateDirectories:YESattributes:nilerror:nil];
? 3.4 在test目錄寫入文件
/*在test目錄寫入文件*/
NSString*testPath = [testDirectorystringByAppendingPathComponent:@"mytest.txt"];
NSString*string =@"IOS開發(fā)hello world";
[fileManagercreateFileAtPath:testPathcontents:[stringdataUsingEncoding:NSUTF8StringEncoding]attributes:nil];
NSString*testPath1 = [testDirectorystringByAppendingPathComponent:@"mytest1.json"];
NSDictionary*dict1 =@{@"姓名":@"jcf",@"性別":@"男"};
NSData*data1 = [NSJSONSerializationdataWithJSONObject:dict1options:NSJSONWritingPrettyPrintederror:nil];
[fileManagercreateFileAtPath:testPath1contents:data1attributes:nil];
/*獲取test目錄所有文件名*/
//兩種方法獲热瞻尽:subpathsOfDirectoryAtPath和subpathsAtPath
NSArray*path =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*documents = [pathobjectAtIndex:0];
NSFileManager*fileManage = [NSFileManagerdefaultManager];
NSString*myDirectory = [documentsstringByAppendingPathComponent:@"test"];
/* subpathsOfDirectoryAtPath */
NSArray*file = [fileManagesubpathsOfDirectoryAtPath: myDirectoryerror:nil];
NSLog(@"%@",file);
/* subpathsAtPath */
NSArray*files = [fileManagesubpathsAtPath: myDirectory ];
NSLog(@"%@",files);
? 3.5 使用文件管理器:fileManager
/*使用文件管理器:fileManager */
//創(chuàng)建文件管理器
NSFileManager*manager = [NSFileManagerdefaultManager];
NSArray*path_manager =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*documents_manager = [path_managerobjectAtIndex:0];
//指定待操作文件
[managerchangeCurrentDirectoryPath:documents_manager ];//將指定的擴展名添加到現(xiàn)有路徑的最后一個組成部分上
NSString* fileTxt =@"testManager.txt";
NSArray*fileArray = [[NSArrayalloc]initWithObjects:@"one",@"two",@"three",nil];
NSData*data = [NSJSONSerializationdataWithJSONObject:fileArrayoptions:NSJSONWritingPrettyPrintederror:nil];
[fileManagercreateFileAtPath:fileTxtcontents:dataattributes:nil];
/*刪除文件*/
[managerremoveItemAtPath:fileTxterror:nil];
? ?3.6 混合數(shù)據(jù)讀寫操作
/*混合數(shù)據(jù)讀寫操作*/
//用NSMutableData創(chuàng)建混合數(shù)據(jù),然后寫到文件里肾胯。并按數(shù)據(jù)的類型把數(shù)據(jù)讀出來
NSString* fileName =@"testFileNSFileManager.txt";
NSArray*path_file =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*document_file = [path_fileobjectAtIndex:0];
//獲取文件路徑
NSString*pathStr = [document_filestringByAppendingPathComponent:fileName];
//待寫入的數(shù)據(jù)
NSString*temp =@"nihao hello";
intdataInt =1234;
floatdataFloat =3.14f;
//創(chuàng)建數(shù)據(jù)緩沖
NSMutableData*writer = [[NSMutableDataalloc]init];
//將字符串添加到緩沖中
[writerappendData:[tempdataUsingEncoding:NSUTF8StringEncoding]];
//將其他數(shù)據(jù)添加到緩沖中
[writerappendBytes:&dataIntlength:sizeof(dataInt)];
[writerappendBytes:&dataFloatlength:sizeof(dataFloat)];
//將緩沖的數(shù)據(jù)寫入到文件中
[writerwriteToFile:pathStratomically:YES];
//讀取數(shù)據(jù):
intintData;
floatfloatData =0.0;
NSString*stringData;
NSData*reader = [NSDatadataWithContentsOfFile:pathStr];
stringData = [[NSStringalloc]initWithData:[readersubdataWithRange:NSMakeRange(0, [templength])]
encoding:NSUTF8StringEncoding];
[reader getBytes:&intData range:NSMakeRange([temp length],sizeof(intData))];
[reader getBytes:&floatData range:NSMakeRange([temp length] +sizeof(intData),sizeof(floatData))];
NSLog(@"stringData:%@ intData:%d floatData:%f", stringData, intData, floatData);
今天的內容進到這里了竖席,不足之處歡迎大家指出 ,謝謝敬肚。
下一篇會給大家著重介紹下數(shù)據(jù)持久化的四種方式 毕荐。。艳馒。
以上是沙盒以及文件操作的內容 下面給大家注上一些常用的api:(?拷貝來的 大家不要介意)
- (NSString*)stringByExpandingTildeInPath
將路徑中的代字符擴展成用戶主目錄(~)或指定用戶的主目錄(~user)憎亚。
還有其他的一些文件操作
+ (NSString *)pathWithComponents(NSArray *)components
根據(jù)components中的元素來構建路徑.
- (NSArray *)pathComponents
解析路徑,返回構成路徑的各個部分.
- (NSString *)lastPathComponent
提取路徑中的最后一個組成部分
- (NSString *)pathExtension
從路徑中最后一個組成部分中提取擴展名
- (NSString *)stringByAppendingPathComponent(NSString*)path
將path添加到現(xiàn)有路徑末尾
- (NSString *)stringByAppendingPathExtension(NSString *)ext
將指定的擴展名添加到現(xiàn)有路徑的最后一個組成部分上
- (NSString *)stringByDeletingLastPathComponent
刪除路徑中的最后一個組成部分
- (NSString *)stringByDeletingPathExtension
從文件的最后一部分刪除擴展名
- (NSString *)stringByExpandingTildeInPath
將路徑中的代字符擴展成用戶主目錄(~)或指定用戶的主目錄(~user)
- (NSString *)stringByResolvingSymlinksInPath
嘗試解析路徑中的符號鏈接
- (NSString *)stringByStandardizingPath
解析路徑中的~,(..)父目錄,(.)當前目錄和符號鏈接來標準化路徑.
常用的路徑工具函數(shù):
NSString * NSUserName (void);
返回當前用戶的登錄名
NSString * NSFullUserName (void);
返回當前用戶的完整用戶名
NSString * NSHomeDirectory (void);
返回當前用戶主目錄的路徑
NSString * NSHomeDirectoryForUser ( NSString *userName)
返回用戶userName的主目錄
NSString * NSTemporaryDirectory (void);
返回可用于創(chuàng)建臨時文件的路徑目錄
NSArray * NSSearchPathForDirectoriesInDomains (
NSSearchPathDirectory directory,
NSSearchPathDomainMask domainMask,
BOOL expandTilde
);
用戶查找特定的目錄,如: NSDocumentationDirectory, NSUserDirectory等等
復制文件和使用NSProcessInfo類
常用的NSProcessInfo類
+ (NSProcessInfo *)processInfo
返回當前進程信息
- (NSArray *)arguments
以NSString對象數(shù)字的形式返回當前進程的參數(shù)
- (NSDictionary *)environment
返回變量/值對字典,以描述當前的環(huán)境變量(比如PATH等等)
- (int)processIdentifier
返回進程PID
- (NSString *)processName
返回當前正在執(zhí)行的進程名稱
- (NSString *)globallyUniqueString
每次調用該方法時,都會返回不同的單值字符串,可以生成臨時文件名
- (NSString *)hostName
返回主機系統(tǒng)名
- (NSUInteger)operatingSystem
返回表示操作系統(tǒng)的數(shù)字
- (NSString *)operatingSystemName
返回操作系統(tǒng)的名稱
- (NSString *)operatingSystemVersionString
返回操作系統(tǒng)版本