iOS基礎--用戶默認設置(NSUserDefaults),文件管理器類(NSFileManager),文件連接器(NSFileHandle)使用總結

欲黃昏,雨打蓮花深閉門!<灰豆鴿>

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>


    ![文件管理器的方法介紹](http://upload-images.jianshu.io/upload_images/1523603-f195344cc0c762d1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

代碼部分:

// 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;


    ![文件對接器的一些方法](http://upload-images.jianshu.io/upload_images/1523603-74f5a9b8a0ea0418.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

代碼部分:

// 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]);






最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末逻恐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子峻黍,更是在濱河造成了極大的恐慌复隆,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姆涩,死亡現(xiàn)場離奇詭異昏名,居然都是意外死亡,警方通過查閱死者的電腦和手機阵面,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洪鸭,“玉大人样刷,你說我怎么就攤上這事±谰簦” “怎么了置鼻?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蜓竹。 經常有香客問我箕母,道長,這世上最難降的妖魔是什么俱济? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任嘶是,我火速辦了婚禮,結果婚禮上蛛碌,老公的妹妹穿的比我還像新娘聂喇。我一直安慰自己,他們只是感情好蔚携,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布希太。 她就那樣靜靜地躺著,像睡著了一般酝蜒。 火紅的嫁衣襯著肌膚如雪誊辉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天亡脑,我揣著相機與錄音堕澄,去河邊找鬼邀跃。 笑死,一個胖子當著我的面吹牛奈偏,可吹牛的內容都是我干的坞嘀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼惊来,長吁一口氣:“原來是場噩夢啊……” “哼丽涩!你這毒婦竟也來了?” 一聲冷哼從身側響起裁蚁,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤矢渊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后枉证,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矮男,經...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年室谚,在試婚紗的時候發(fā)現(xiàn)自己被綠了毡鉴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡秒赤,死狀恐怖猪瞬,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情入篮,我是刑警寧澤陈瘦,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站潮售,受9級特大地震影響痊项,放射性物質發(fā)生泄漏。R本人自食惡果不足惜酥诽,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一鞍泉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肮帐,春花似錦塞弊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肮砾,卻和暖如春诀黍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仗处。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工眯勾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留枣宫,地道東北人。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓吃环,卻偏偏與公主長得像也颤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子郁轻,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內容

  • 27翅娶、ViewController的didReceiveMemoryWarning是在什么時候調用的?默認的操作是...
    煙雨平生花飛舞閱讀 588評論 0 1
  • 站在前輩的肩膀上前行 UIKit框架和Foundation框架 所有的Mac OS X和IOS程序都是由大量的對象...
    zysmoon閱讀 8,703評論 0 16
  • 2016.05.20 10:24 塵封已久的學習基礎總結,最近公司項目不是很忙骑篙,終于抽空整理出來蜕提,現(xiàn)分享出來。 1...
    si1ence閱讀 19,727評論 61 589
  • 1.屬性readwrite靶端,readonly谎势,assign,retain杨名,copy它浅,nonatomic 各是什么作...
    曾令偉閱讀 1,063評論 0 10
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,163評論 30 470