1、簡介緩存
每一個iOS應用都有本身的應用沙盒(應用沙盒就是文件系統目錄),與其餘文件系統隔離。網絡
應用必須待在本身的沙盒裏,其餘應用不能訪問該沙盒atom
2、應用沙盒目錄spa
Application應用程序包:包含了全部的資源文件和和可執行文件,上架前通過數字簽名,上架後不可修改code
Documents:保存應用程序自己運行時產生的文件或者數據,iCloud備份目錄,例如:遊戲進度、塗鴉軟件的繪圖orm
注意點:不要保存從網絡上下載的文件,不然會沒法上架!對象
Library遊戲
用戶偏好,使用 NSUserDefault 直接讀寫!圖片
若是要想數據及時寫入磁盤,還須要調用一個同步方法資源
保存臨時文件,"後續須要使用",例如:緩存圖片,離線數據(地圖數據)
系統不會清理 cache 目錄中的文件
就要求程序開發時,"必須提供 cache 目錄的清理解決方案"
Caches:存放體積大又不須要備份的數據
Preference:保存應用的全部偏好設置,iCloud會備份設置信息
tmp:存放臨時文件,不會被備份,並且這個文件下的數據有可能隨時被清除的可能
保存臨時文件,"後續不須要使用"
tmp 目錄中的文件,系統會自動清理
從新啓動手機,tmp 目錄會被清空
系統磁盤空間不足時,系統也會自動清理
3、應用沙盒目錄的常見獲取方式
// 沙盒根目錄 NSString *homeDir = NSHomeDirectory(); NSLog(@"homeDir: %@", homeDir); // 獲取tmp目錄 NSString *tmpDir = NSTemporaryDirectory(); NSLog(@"tmpDir: %@", tmpDir); // NSUserDomainMask 表明從用戶文件夾下找 // YES 表明展開路徑中的波浪字符「~」 // 在iOS中,只有一個目錄跟傳入的參數匹配,因此這個集合裏面只有一個元素NSString*documents =[array objectAtIndex:0]; NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO) objectAtIndex:0]; NSLog(@"Documents: %@", documents); // 獲取Documents目錄 // NSSearchPathForDirectoriesInDomains(要查找的目錄, 是不是用戶主目錄, YES/NO 是否獲取全路徑); NSArray *arr1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSLog(@"Documents: %@", [arr1 lastObject]); // 獲取Library目錄 NSArray *arr2 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSLog(@"Library: %@", [arr2 lastObject]); // 獲取Library/Caches目錄 NSArray *arr3 = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSLog(@"Caches: %@", [arr3 lastObject]); // 獲取Library/Preferences目錄 NSArray *arr4 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSString *path = [arr4 lastObject]; path = [path stringByAppendingPathComponent:@"Preferences"]; NSLog(@"Preferences: %@", path); // 寫入文件到指定的文件夾下 NSString *path2 = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, NO) objectAtIndex:0]; path2 = [path2 stringByAppendingPathComponent:@"Preferences/test.txt"]; NSString *str = @"Jacedy"; [str writeToFile:path2 atomically:YES encoding:NSUTF8StringEncoding error:nil]; // 建立目錄 NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *testDir = [path2 stringByAppendingPathComponent:@"test"]; [fileManager createDirectoryAtPath:testDir withIntermediateDirectories:YES attributes:nil error:nil]; if ([fileManager fileExistsAtPath:testDir]) { NSLog(@"It is exist"); }
// 文件操做 - (void)fileManage { NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; #pragma mark - NSString寫入文件 NSString *txtPath = [docPath stringByAppendingPathComponent:@"bada.txt"];// 此時僅存在路徑,文件並無真實存在 NSString *string = @"莽荒記"; [string writeToFile:txtPath atomically:YES encoding:NSUTF8StringEncoding error:nil];// 字符串寫入時執行的代碼 NSLog(@"%@", txtPath); #pragma mark - NSData寫入文件 NSString *dataPath = [docPath stringByAppendingPathComponent:@"icon.jpg"]; UIImage *image = [UIImage imageNamed:@"640*960.jpg"]; NSData *data = UIImageJPEGRepresentation(image, 1.0); [data writeToFile:dataPath atomically:YES]; NSLog(@"dataPath: %@", dataPath); #pragma mark - 建立文件夾 NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *testDir = [docPath stringByAppendingPathComponent:@"test"]; [fileManager createDirectoryAtPath:testDir withIntermediateDirectories:YES attributes:nil error:nil]; if ([fileManager fileExistsAtPath:testDir]) { NSLog(@"It is exist"); } // 獲取默認問價或者某個文件夾的大小 NSDictionary *dic = [fileManager attributesOfItemAtPath:docPath error:nil]; NSLog(@"dic: %@", dic); NSNumber *number = [dic objectForKey:NSFileSize]; NSLog(@"number: %@", number); } // 文件移動 - (void)fileMove { #pragma mark - 文件移動 // 建立文件夾 NSString *docPath1 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; NSString *dirPath = [docPath1 stringByAppendingPathComponent:@"path"]; NSFileManager *fileManager1 = [NSFileManager defaultManager]; [fileManager1 createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil]; // 建立文件 NSString *filePath = [dirPath stringByAppendingPathComponent:@"test1.txt"]; [fileManager1 createFileAtPath:filePath contents:nil attributes:nil]; // 將圖片對象存入到該文件中 UIImage *image1 = [UIImage imageNamed:@"640*960.jpg"]; NSData *data1 = UIImageJPEGRepresentation(image1, 1.0); [data1 writeToFile:filePath atomically:YES]; NSLog(@"%@", filePath); // 移動文件 NSString *desPath = [docPath1 stringByAppendingPathComponent:@"test1.txt"]; [fileManager1 moveItemAtPath:filePath toPath:desPath error:nil]; } // 文件更改 - (void)changeFile { // 1.獲取Documents路徑 NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; // 2.建立文件路徑 NSString *filePath = [docPath stringByAppendingPathComponent:@"text.txt"]; // 3.使用文件管理對象建立文件 NSFileManager *fileManager = [NSFileManager defaultManager]; [fileManager createFileAtPath:filePath contents:[@"abcdefg" dataUsingEncoding:NSUTF8StringEncoding] attributes:nil]; // 4.建立文件對接對象 NSFileHandle *handle = [NSFileHandle fileHandleForUpdatingAtPath:filePath];// 文件對象此時針對文件,可讀可寫 // 5.將偏移量移動到3的位置 [handle seekToFileOffset:3]; // 6.寫入數據 [handle writeData:[@"1234" dataUsingEncoding:NSUTF8StringEncoding]]; // 7.執行完操做後,關閉文件 [handle closeFile]; NSLog(@"%@", filePath); }