文件管理器與文件對接器以及復(fù)雜對象的讀寫(I/O)操作

SendBoxPaths是我自己寫的簡單對象讀寫(I/O)操作的封裝方法

*以下關(guān)于這類[SendBoxPaths ...Path]的是我調(diào)用自己封裝的方法 有興趣的朋友可以看看
http://www.reibang.com/p/12f2cb693b67


文件管理器(NSFileManager)

  • 此類主要是對文件進行的操作(創(chuàng)建/刪除/改名等)以及文件信息的獲取。
  • 以下是NSFileManager的一些操作方法


    44CC2734-2923-4A31-A291-D8AF9F4F8A9C.png
44CC2734-2923-4A31-A291-D8AF9F4F8A9C.png

記得導包 #import "SendBoxPaths.h"

//NSFileManager的應(yīng)用
- (void)myFileManager{
    //獲取文件管理對象
    NSFileManager* fileManager = [NSFileManager defaultManager];
    //創(chuàng)建文件,并寫入數(shù)據(jù),如果該方法的返回值為YES:文件創(chuàng)建成功或者文件已經(jīng)存在,
    //第一個參數(shù):要創(chuàng)建文件的路徑
    //第二個參數(shù):要創(chuàng)建文件的內(nèi)容
    //第三個參數(shù):要設(shè)置文件的用戶組、權(quán)限柿祈、修改時間等設(shè)置。如果賦值為nil蕾总,系統(tǒng)會為文件加一些默認設(shè)置
    //創(chuàng)建文件路徑
    NSString* path = [[SendBoxPaths cachesPath] stringByAppendingPathComponent:@"array.json"];
    //創(chuàng)建要寫入的內(nèi)容
    NSArray* array = @[@"王",@"余",@"李",@"雷"];
    //數(shù)組轉(zhuǎn)為NSData
    NSData* arrayData = [NSJSONSerialization dataWithJSONObject:array options:NSJSONWritingPrettyPrinted error:nil];
    BOOL isSuccess = [fileManager createFileAtPath:path contents:arrayData attributes:nil];
    if (isSuccess) {
        NSLog(@"isSuccess---%@",[SendBoxPaths cachesPath]);
    }else{
        NSLog(@"fail");
    }
    //讀取數(shù)據(jù)
    //先判斷該路徑下文件是否存在
    if ([fileManager fileExistsAtPath:path]) {
    
    NSData* readData = [fileManager contentsAtPath:path];
    NSArray* readArray = [NSJSONSerialization JSONObjectWithData:readData options:NSJSONReadingAllowFragments error:nil];
    NSLog(@"readArray---%@",readArray);
    }else{
        NSLog(@"該路徑下文件不存在");
    }
    
//    
//    //將caches中的文件的array.json文件移動到documents下
//    BOOL isMove = [fileManager moveItemAtPath:path toPath:[[SendBoxPaths documentsPath] stringByAppendingPathComponent:@"newArray.json"] error:nil];
//    if (isMove) {
//        NSLog(@"移動成功");
//    }else{
//        NSLog(@"移動失敗");
//    }
    NSLog(@"documentsPath--%@",[SendBoxPaths documentsPath]);
    //將原有路徑下的文件cory到新的路徑下
    BOOL isCopy = [fileManager copyItemAtPath:path toPath:[[SendBoxPaths documentsPath] stringByAppendingPathComponent:@"copyArray.json" ] error:nil];
    if (isCopy) {
         NSLog(@"coyp成功");
    }else{
        NSLog(@"coyp失敗");
    }
    //比較文件內(nèi)容
    BOOL isEqual = [fileManager contentsEqualAtPath:path andPath:[[SendBoxPaths documentsPath] stringByAppendingPathComponent:@"copyArray.json" ]];
    if (isEqual) {
        NSLog(@"文件內(nèi)容相同");
    }else{
        NSLog(@"文件內(nèi)容不同");
    }
    
    //刪除文件
    BOOL isRemove = [fileManager removeItemAtPath:path error:nil];
    if (isRemove) {
        NSLog(@"刪除成功");
    }else{
        NSLog(@"刪除失敗");
    }
    //創(chuàng)建文件夾
    //第一個參數(shù):要創(chuàng)建的文件夾的路徑
    //第二個參數(shù):YES:如果父目錄(文件夾)不存在笑跛,創(chuàng)建的時候會將父目錄一起創(chuàng)建;NO:如果父類目錄不存在,那么文件夾就會創(chuàng)建失敗
    //第三個參數(shù):文件夾的權(quán)限
    BOOL iscreate = [fileManager createDirectoryAtPath:[[SendBoxPaths homePath] stringByAppendingPathComponent:@"AAA/bbb" ]  withIntermediateDirectories:YES attributes:nil error:nil];
    if (iscreate) {
        NSLog(@"創(chuàng)建成功");
    }else{
        NSLog(@"創(chuàng)建失敗");
    }
    NSLog(@"homePath---%@",[SendBoxPaths homePath]);
}
  • 切記要在- (void)viewDidLoad;方法里面調(diào)用

文件連接器(NSFileHandle)

  • 是非撤揽基礎(chǔ)的只針對“文件內(nèi)容”的操作(讀取牺丙、寫入和更新)则涯。
  • 使用場景 對文件內(nèi)容的進行局部修改复局、追加內(nèi)容。
  • 使用步驟
    1.文件對接并獲取一個NSFilehandle對象
    2.讀寫操作
    3.關(guān)閉對接
  • *注意
    NSFileHandle類并沒有提供創(chuàng)建文件的功能粟判。必須使用NSFileManager方法來創(chuàng)建文件亿昏。因此在使用下面表中的方法是,都是保證文件以及存放在,否則返回nil.
  • 文件對接器(NSFileHandle)的 一些方法
A7896233-2F8D-403A-B9D9-CC34EE11CD45.png
752D79E4-5404-41B8-A748-CF815796E1B4.png

記得導#import "SendBoxPaths.h" 包

//NSFileHandle的使用
-(void)myFileHandle{
    //判斷某個路徑下的文件是否存在,如果存在直接通過handle對象向里面寫入內(nèi)容;如果不存在,先創(chuàng)建該文件档礁,在進行操作角钩。
    //獲取文件管理對象
    NSFileManager* fileManager = [NSFileManager defaultManager];
    NSString* path = [[SendBoxPaths documentsPath] stringByAppendingPathComponent:@"test.txt"];
    BOOL isExists = [fileManager fileExistsAtPath:path];
    if (!isExists) {
        //文件不存在  創(chuàng)建
        [fileManager createFileAtPath:path contents:nil attributes:nil];
    }
    //對文件內(nèi)容進行操作
    //向文件寫入內(nèi)容
    NSFileHandle* fileHandle = [NSFileHandle fileHandleForWritingAtPath:path];
    //準備數(shù)據(jù)
    NSString* inputString = @"111111";
    NSData* inputData = [inputString dataUsingEncoding:NSUTF8StringEncoding];
    //寫入
    [fileHandle writeData:inputData];
    //操作完畢,一定要關(guān)閉
    [fileHandle closeFile];
    //更新數(shù)據(jù)為 劉·最帥·元
    NSFileHandle* updateFileHandle = [NSFileHandle fileHandleForUpdatingAtPath:path];
    //我們要從“劉”之后寫入數(shù)據(jù)呻澜,我們需要將文件偏移量設(shè)置為1,然后再開始寫入递礼。 相當于從1位置開始,將后面的內(nèi)容進行替換
    [updateFileHandle seekToFileOffset:1];
    //寫入要增加的數(shù)據(jù)
    NSData* addData = [@"23" dataUsingEncoding:NSUTF8StringEncoding];
    [updateFileHandle writeData:addData];
    //操作完畢羹幸,一定要關(guān)閉
    [updateFileHandle closeFile];
    //讀取
    NSFileHandle* readFileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
    //設(shè)置要讀取的多長內(nèi)容
//    NSData* readData = [readFileHandle readDataOfLength:3];
    NSData* readData = [readFileHandle readDataToEndOfFile];//讀取所有的內(nèi)容
    //關(guān)閉
    [readFileHandle closeFile];
    //將data轉(zhuǎn)換為字符串
    NSString*  readSting = [[NSString alloc] initWithData:readData encoding:NSUTF8StringEncoding];
    NSLog(@"readSting---%@",readSting);
}
  • 切記要在- (void)viewDidLoad;方法里面調(diào)用

復(fù)雜對象的讀寫(I/O)操作

復(fù)雜對象

  • 在Foundation框架內(nèi) 不存在的數(shù)據(jù)類, 如:自定義Person類 無法再程序內(nèi)通過writeToFile:這個方法寫入到文件內(nèi)

歸檔與反歸檔

  • 如何將復(fù)雜對象寫入文件脊髓?
    復(fù)雜對象無法通過writeToFile:方法進行數(shù)據(jù)持久化,只能通過將復(fù)雜對象轉(zhuǎn)為nSData(這個步驟就是歸檔)栅受,然后在通過writeToFile:寫入文件
  • 記住
    1.復(fù)雜對象寫入文件的過程(復(fù)雜對象 ->歸檔->NSData->writeToFile:)
    2.從文件讀取復(fù)雜對象過程(讀取文件->NSData->反歸檔->復(fù)雜對象)
  • 復(fù)雜對象所屬的類要遵守<NSCoding>協(xié)議
  • 實現(xiàn)協(xié)議中的兩個方法
    1.-(void)encodeWithCoder:(NSCoder *)aCoder;
    2.-(id)initWithCoder:(NSCoder *)aDecoder;

代碼示例

首先建一個Person類

#import <Foundation/Foundation.h>
//要對復(fù)雜對象進行歸檔将硝,必須遵循一個協(xié)議
@interface Person : NSObject<NSCoding>
@property (nonatomic,strong) NSString* name;
@property (nonatomic,assign) int age;
@end
#Person的.m
#import "Person.h"
@implementation Person
//歸檔的過程:相當于將復(fù)雜對象轉(zhuǎn)NSData類型,為了寫入文件。
-(void)encodeWithCoder:(NSCoder *)aCoder{
    //歸檔的過程是將當前對象每一個屬性都進行編碼屏镊。
    //第一個參數(shù):要進行編碼的屬性的值
    //第二個參數(shù):為屬性的值加標記,加標記是為了解碼使用
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInt:self.age forKey:@"age"];
    NSLog(@"調(diào)用歸檔的方法");
}
//反歸檔:將NSData轉(zhuǎn)換為復(fù)雜對象依疼,為了讀取使用。
-(id)initWithCoder:(NSCoder *)aDecoder{
    NSLog(@"調(diào)用反歸檔的方法");
    self = [super init];
    if (self) {
        //解碼 從文件中讀取出來值而芥,賦值給對應(yīng)的屬性
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeIntForKey:@"age"];
    }
    return self;
}
@end

在ViewController.m中記得導包

#import "SendBoxPaths.h"

#import "Person.h"

*代碼示例

//歸檔的過程
- (void)myEncoder{
    //需要聲明創(chuàng)建一個person對象用來歸檔
    Person* person = [[Person alloc] init];
    person.name = @"劉元";
    person.age = 123;
    //需要創(chuàng)建一個可變的data對象律罢,用來存放歸檔好的person對象
    NSMutableData* mData = [[NSMutableData alloc]init];
    //創(chuàng)建歸檔工具對象
    //參數(shù)為要承接歸檔完成的復(fù)雜對象:
    NSKeyedArchiver* archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:mData];
    //歸檔
    //第一個參數(shù):要歸檔的復(fù)雜對象
    //第二個參數(shù):標記,為了反歸檔使用
    [archiver encodeObject:person forKey:@"person"];
    //歸檔結(jié)束棍丐,一定調(diào)用下面這個方法误辑,要不然mData中不會有值
    [archiver finishEncoding];
    //將MData持久化到本地文件
    NSString* path = [[SendBoxPaths documentsPath]stringByAppendingPathComponent:@"archiver.data"];
    [mData writeToFile:path atomically:YES];
}
//反歸檔
-(void)unArchiver{
    //將剛才歸檔文件中的data數(shù)據(jù)讀取出來,以便反歸檔使用
    NSString* path = [[SendBoxPaths documentsPath]stringByAppendingPathComponent:@"archiver.data"];
    NSData* data = [NSData dataWithContentsOfFile:path];
    //初始化一個反歸檔工具
    NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
    //反歸檔
    Person* person = [unarchiver decodeObjectForKey:@"person"];
    //反歸檔結(jié)束的方法骄酗,必須調(diào)用
    [unarchiver finishDecoding];
    NSLog(@"name === %@,age === %d",person.name,person.age);
}
  • 切記要在- (void)viewDidLoad;方法里面調(diào)用

不足之處希望大家見諒稀余,我會在更新

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市趋翻,隨后出現(xiàn)的幾起案子睛琳,更是在濱河造成了極大的恐慌盒蟆,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件师骗,死亡現(xiàn)場離奇詭異历等,居然都是意外死亡,警方通過查閱死者的電腦和手機辟癌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門寒屯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人黍少,你說我怎么就攤上這事寡夹。” “怎么了厂置?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵菩掏,是天一觀的道長。 經(jīng)常有香客問我昵济,道長智绸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任访忿,我火速辦了婚禮瞧栗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘海铆。我一直安慰自己迹恐,他們只是感情好,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布游添。 她就那樣靜靜地躺著系草,像睡著了一般。 火紅的嫁衣襯著肌膚如雪唆涝。 梳的紋絲不亂的頭發(fā)上找都,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機與錄音廊酣,去河邊找鬼能耻。 笑死,一個胖子當著我的面吹牛亡驰,可吹牛的內(nèi)容都是我干的晓猛。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼凡辱,長吁一口氣:“原來是場噩夢啊……” “哼戒职!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起透乾,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤洪燥,失蹤者是張志新(化名)和其女友劉穎磕秤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捧韵,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡市咆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了再来。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒙兰。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖芒篷,靈堂內(nèi)的尸體忽然破棺而出搜变,到底是詐尸還是另有隱情,我是刑警寧澤梭伐,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布痹雅,位于F島的核電站,受9級特大地震影響糊识,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜摔蓝,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一赂苗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贮尉,春花似錦拌滋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至魏铅,卻和暖如春昌犹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背览芳。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工斜姥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沧竟。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓铸敏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悟泵。 傳聞我的和親對象是個殘疾皇子杈笔,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

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

  • 本章包含的四個知識點: 一、沙盒機制 二糕非、簡單對象的寫入與讀取 三蒙具、文件管理器 四敦第、復(fù)雜對象的寫入與讀取 一、 i...
    逗逗豆豆笑閱讀 1,413評論 0 5
  • 下面是我最近兩年學習OC中的一些基礎(chǔ)知識店量,對于學習OC基礎(chǔ)知識的人可能有些幫助芜果,拿出來分享一下,還是那句話不喜勿噴...
    小小趙紙農(nóng)閱讀 2,607評論 1 7
  • 一融师、數(shù)據(jù)持久化概述 數(shù)據(jù)持久化就是數(shù)據(jù)的永久存儲右钾。其本質(zhì)是將數(shù)據(jù)保存為文件,存到程序的沙盒中旱爆。 1舀射、數(shù)據(jù)持久化的方...
    lilinjianshu閱讀 613評論 0 1
  • iOS 開発の結(jié)構(gòu) 畫面 UI UIWebview [[UIApplication sharedApplicati...
    RencaiXiong閱讀 588評論 0 0
  • 本文結(jié)構(gòu) 參考孟巖老師的文章,對本文結(jié)構(gòu)如下劃分 基本數(shù)據(jù)類型基本語法數(shù)組和其他集合類基本輸入輸出和文件處理怀伦,輸入...
    不抄完整本三國不改名閱讀 521評論 0 1