NSUserDefault:
NSUserDefault : 是一個單例, 在整個程序中只有一個實例對象,它可以用于數(shù)據(jù)的永久保存而且簡單實用, 這是他可以讓數(shù)據(jù)自由傳遞的一個前提. (可以存儲用戶信息, 夜間模式, 字體大小)
在使用 NSUserDefaults存儲對象的最初,我們必須知道可以存儲哪些類型數(shù)據(jù)
1: NSNumber (NSinteger, float, doubel)
2:NSString, NSArray, NSDictionary, BOOL, NSDate
NSUserDefaults 存儲的對象全是不可變的(這一點非常關鍵溜畅,弄錯的話程序會出bug)谈山,例如尺借,如果我想要存儲一個 NSMutableArray 對象爵赵,我必須先創(chuàng)建一個不可變數(shù)組(NSArray)再將它存入NSUserDefaults中去
- 注意: 對相同的Key賦值約等于一次覆蓋,這保證每一個Key的唯一性.
簡單代碼舉例:
// 使用 NSUserDefaults 進行存儲
// 1: 創(chuàng)建要存儲的數(shù)組
NSArray *aar = @[@"1",@"2",@"3"];
// 2: 創(chuàng)建NSUserDefaults對象
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:aar forKey:@"userArray"];
// 3: 取出數(shù)據(jù)
NSLog(@"**********%@",[user objectForKey:@"userArray"]);
下面是存儲可變數(shù)組的代碼:
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234",@"456", nil];
NSArray *array1 = [NSArray arrayWithArray:mutableArray];
NSUserDefaults *user2 = [NSUserDefaults standardUserDefaults];
[user2 setObject:array1 forKey:@"這里存放的一定是不可變的"];
// 取出數(shù)據(jù)是一樣的宪睹,想要用NSUserDefaults中的數(shù)據(jù)給可變數(shù)組賦值
/*-------------- 錯誤方法 --------------*/
// NSMutableArray *mutablearray = [user objectForKey:@"我們這里存放的一定是不可變的"];
// //這樣寫后绞旅,mutableArray 就變成了不可變數(shù)組了,如果你要在數(shù)組中添加或刪除數(shù)據(jù)就會出現(xiàn)bug
// NSLog(@"%@",mutablearray);
//正確的做法:
NSMutableArray *mutablearray = [NSMutableArray arrayWithArray:[user2 objectForKey:@"這里存放的一定是不可變的"]];
NSLog(@"%@",mutablearray);
NSFileManager:和NSFileHandle:
- 文件管理器( NSFileManager ) : 此類主要是對文件進行的操作( <big>創(chuàng)建, 刪除, 改名</big> 等) 以及文件<big>文件信息類容的獲取</big>
-
文件連接器( NSFileHandle ) : 此類主要是對文件內容進行<big>讀取和寫入操作</big>

代碼部分:
// 1: 創(chuàng)建一個 文件管理器類的實例對象 (單例類)
NSFileManager *fileManager = [NSFileManager defaultManager];
// 2: 創(chuàng)建一個文件夾路徑
NSString *filePath =[NSHomeDirectory() stringByAppendingString:@"/filePath/text"];
// 3: 創(chuàng)建目錄
/*
參數(shù)1: createDirectoryAtPath: 文件路徑
參數(shù)2: withIntermediateDirectories:設置是否可以同時創(chuàng)建多級目錄下的文件夾
參數(shù)3: 屬性權限
參數(shù)4: 錯誤信息
*/
[fileManager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];
// 4: 創(chuàng)建文件
filePath = [filePath stringByAppendingString:@"/text.txt"];
// if ([fileManager createFileAtPath:filePath contents:nil attributes:nil])
// {
// NSLog(@"4: 創(chuàng)建文件成功%@",filePath);
// }
// 5: 寫入文件 并判斷是否成功
NSString *str = @"烽火連三月,家書抵萬金";
// if ([str writeToFile:filePath atomically:0 encoding:NSUTF8StringEncoding error:nil])
// {
// NSLog(@"5: 寫入文件成功%@",filePath);
// }
// 4: 和 5: 寫在一起 可省略5的判斷
if([fileManager createFileAtPath:filePath contents:[str dataUsingEncoding:NSUTF8StringEncoding] attributes:nil])
{
NSLog(@"4: 和 5: 創(chuàng)建成功!并賦值 %@",filePath);
}
// 6: 判斷文件是否存在
if ([fileManager fileExistsAtPath:filePath])
{
NSLog(@"6: 證明文件存在");
}
// 7: 再建個文件 (和第一個路徑不一樣)
NSString *copyPath =[NSHomeDirectory() stringByAppendingString:@"/filePath2"];
[fileManager createDirectoryAtPath:copyPath withIntermediateDirectories:1 attributes:nil error:nil];
// 這里不是新建文件 只是弄了個目錄
copyPath = [copyPath stringByAppendingString:@"/text2.txt"];
if (![fileManager fileExistsAtPath:copyPath])
{
NSLog(@"7: 不存在文件copypath%@",copyPath);
}else
{
NSLog(@"7:****** 存在");
}
// 8: 把第一個文件內容 復制到 第二個中去 (第二個文件必須是不存在的否則失敗)
if([fileManager copyItemAtPath:filePath toPath:copyPath error:nil])
{
NSLog(@"8: 復制成功了恭喜你");
}else
{
NSLog(@"8: 復制失敗了");
}
/* 復制可以這樣用 寫在一起,方便直接看
NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"/text.txt"];
NSString *fileContent = @"最是人間留不住,朱顏辭鏡花辭樹";
NSFileManager *manager = [NSFileManager defaultManager];
if ([manager createFileAtPath:filePath contents:[fileContent dataUsingEncoding:NSUTF8StringEncoding] attributes:nil]) {
NSLog(@"1: 創(chuàng)建成功%@",filePath);
}
// 上面是創(chuàng)建一個文件(路徑 --> 內容 --> Manager創(chuàng)建) 下面是拷貝到另一個文件(路徑 --> ManagerCopy )
NSString *copyPath = [NSHomeDirectory() stringByAppendingString:@"/text2.txt"];
if ([manager copyItemAtPath:filePath toPath:copyPath error:nil]) {
NSLog(@"2: 恭喜你復制成功");
} */
// 9: 比較兩文件是否相等
if([fileManager contentsEqualAtPath:filePath andPath:copyPath])
{
NSLog(@"9: 兩者相等'");
}
// 10: 刪除文件
if([fileManager removeItemAtPath:filePath error:nil])
{
NSLog(@"7: 刪除文件成功");
}
// 11: 判斷是否不存在
if (![fileManager fileExistsAtPath:filePath])
{
NSLog(@"8: 證明文件不存在");
}
// 12: 路徑讀取內容:( contentsAtPath: ) 這里用NSString接收一下
NSString *strDetailCopy = [[NSString alloc] initWithData:[fileManager contentsAtPath:copyPath] encoding:NSUTF8StringEncoding];
NSLog(@"3: 讀取復制結果---> %@",strDetailCopy);
NSFileHandle:
NSFileHandle:是非扯嗤В基礎的只針對文件內容的的操作<big>(寫入, 讀取, 更新 )</big>是把 NSData通過連接器一個字節(jié)一個字節(jié)的寫入/讀取文件(NSData <--> NSFileHandle <--->文件)
- 使用場景: 對文件內容進行局部修改, 追加內容
- 使用步驟:
- 文件對接并獲取一個NSFileHandle對象
- 讀寫操作
- 關閉對接
-
注意:NSFileHandle:類并沒有提供創(chuàng)建文件的功能. 必須使用NSFileManager方法來創(chuàng)建文件. 因此,在使用 NSFileHandle 的方法時候, 都必須保證文件已經存在否則返回nil;

代碼部分:
// 1: 創(chuàng)建一個文件
NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"/text.txt"];
NSString *fileContent = @"最是人間留不住,朱顏辭鏡花辭樹";
NSFileManager *manager = [NSFileManager defaultManager];
if ([manager createFileAtPath:filePath contents:[fileContent dataUsingEncoding:NSUTF8StringEncoding] attributes:nil]) {
NSLog(@"1: 創(chuàng)建成功%@",filePath);
}
// 2: 創(chuàng)建第二個文件 用于寫數(shù)據(jù) ( 必須要有這個文件,才能進行內容的操作寫入 )
NSString *copyPath = [NSHomeDirectory() stringByAppendingString:@"/text2.txt"];
[[NSFileManager defaultManager] createFileAtPath:copyPath contents:nil attributes:nil];
// 3: 打開text.txt 用于讀操作
NSFileHandle *fileHandleRead = [NSFileHandle fileHandleForReadingAtPath:filePath];
if (!fileHandleRead)
{
NSLog(@"3: 打開filepath讀功能失敗");
}
// 4: 打開text2.txt 的寫入操作
NSFileHandle *fileHandleWrite = [NSFileHandle fileHandleForWritingAtPath:copyPath];
if (!fileHandleWrite)
{
NSLog(@"4: 打開text2.txt 的寫入操作 失敗");
}
// 5: 創(chuàng)建 NSData 實例接收fileHandleRead數(shù)據(jù)
NSData *dataTemp = [fileHandleRead readDataToEndOfFile];
// 6: 寫入到 fileHandleWrite 里面
[fileHandleWrite writeData:dataTemp];
// 7: 看能否從CopyPath中取出數(shù)據(jù) 驗證效果
NSLog(@"從CopyPath中讀取數(shù)據(jù) --> %@",[NSString stringWithContentsOfFile:copyPath encoding:NSUTF8StringEncoding error:nil]);