iOS數(shù)據(jù)文件存儲二

前言

因為這一段時間有需求需要用到文件的存取操作培己,而之前基本上對于本地數(shù)據(jù)的存儲就是簡單數(shù)據(jù)用NSUserDefaults碳蛋,復(fù)雜點的用歸檔,再復(fù)雜一點的用sql省咨。對于文件存取了解不多∷嗟埽現(xiàn)在需求來了,沒辦法零蓉,只能脫了褲子就是...笤受。
文件存儲分三節(jié)來說:

正文

NSFileManager

NSFileManager 是iOS的文件管理的一個類章喉,主要是對文件進(jìn)行創(chuàng)建汗贫,刪除身坐,獲取文件信息等操作。有一點要知道落包,NSFileManager的使用級別是文件部蛇,他不能對文件里面的內(nèi)容做什么處理操作。你想修改一個txt里面的數(shù)據(jù)咐蝇,對不起涯鲁,NSFileManager幫助不了你的,這時候就需要NSFileHandle來救場有序,一會再說這個類抹腿。
NSFileManager 里面的方法有很多,平常我(low??程序??)使用到了基本上就幾個:

//創(chuàng)建一個文件笔呀,并給文件內(nèi)容
- (BOOL)createFileAtPath:(NSString *)path contents:(nullable NSData *)data attributes:(nullable NSDictionary<NSString *, id> *)attr;

//創(chuàng)建一個文件夾
- (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(nullable NSDictionary<NSString *, id> *)attributes error:(NSError **)error NS_AVAILABLE(10_5, 2_0);

//判斷文件是否存在
- (BOOL)fileExistsAtPath:(NSString *)path;
- (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(nullable BOOL *)isDirectory;

//文件的復(fù)制幢踏,移動髓需,刪除操作
- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error NS_AVAILABLE(10_5, 2_0);
- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error NS_AVAILABLE(10_5, 2_0);
- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error NS_AVAILABLE(10_5, 2_0);

舉個栗子:

//1 存儲路徑的獲取
    NSString *path1 = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/file_test1.txt"];
    
    //2 創(chuàng)建文件需要一個文件管理對象
    NSFileManager *manager = [NSFileManager defaultManager];
    
    //3 創(chuàng)建文件
    NSString *testStr = @"這是一個文件測試";
    [manager createFileAtPath:path1 contents:[testStr dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];

栗子標(biāo)準(zhǔn)了步驟许师,萬年按照步驟走,就不會有事僚匆,思路最重要微渠。
可以看到,NSFileManager需要單例創(chuàng)建, 然后調(diào)用創(chuàng)建文件的方法

- (BOOL)createFileAtPath:(NSString *)path contents:(nullable NSData *)data attributes:(nullable NSDictionary<NSString *, id> *)attr;

這個方法需要傳入的數(shù)據(jù)為NSData類型咧擂,所以要進(jìn)行一次NSData的轉(zhuǎn)換逞盆。
到底創(chuàng)建成功了沒有呢,我們?nèi)ノ募穆窂讲樵円幌?br> 效果:


栗子一

說明文件已經(jīng)創(chuàng)建成功了松申。那么云芦,我們怎么去查詢這個文件的一些信息嗎。這還不簡單贸桶,點擊文件->右鍵->顯示簡介舅逸,搞定了···。??????皇筛,出門左拐琉历,不謝。
正確姿勢:

//獲取文件信息
    NSDictionary *dic = [manager attributesOfItemAtPath:path1 error:nil];
    
    [dic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        
        NSLog(@"key = %@,value = %@",key,obj);
    }];

然后輸出獲得的屬性字典水醋,查看所有的文件屬性:

2017-09-08 13:25:14.782 文件讀寫Demo[2532:368804] key = NSFileOwnerAccountID,value = 501
2017-09-08 13:25:14.783 文件讀寫Demo[2532:368804] key = NSFileSystemFileNumber,value = 23349726
2017-09-08 13:25:14.783 文件讀寫Demo[2532:368804] key = NSFileExtensionHidden,value = 0
2017-09-08 13:25:14.783 文件讀寫Demo[2532:368804] key = NSFileSystemNumber,value = 16777220
2017-09-08 13:25:14.783 文件讀寫Demo[2532:368804] key = NSFileSize,value = 24
2017-09-08 13:25:14.783 文件讀寫Demo[2532:368804] key = NSFileGroupOwnerAccountID,value = 20
2017-09-08 13:25:14.784 文件讀寫Demo[2532:368804] key = NSFilePosixPermissions,value = 420
2017-09-08 13:25:14.786 文件讀寫Demo[2532:368804] key = NSFileCreationDate,value = 2017-09-08 05:25:14 +0000
2017-09-08 13:25:14.786 文件讀寫Demo[2532:368804] key = NSFileType,value = NSFileTypeRegular
2017-09-08 13:25:14.787 文件讀寫Demo[2532:368804] key = NSFileGroupOwnerAccountName,value = staff
2017-09-08 13:25:14.787 文件讀寫Demo[2532:368804] key = NSFileReferenceCount,value = 1
2017-09-08 13:25:14.787 文件讀寫Demo[2532:368804] key = NSFileModificationDate,value = 2017-09-08 05:25:14 +0000

如果旗笔,我們文件創(chuàng)建成功了,但是卻發(fā)現(xiàn)路徑錯了拄踪,那應(yīng)該怎么辦呢蝇恶?不用怕,NSFileManager可以幫你惶桐。

//6 移動后的文件路徑位置
    NSString *resultPath = [cachesPath stringByAppendingPathComponent:[path lastPathComponent]];
    
    //7 移動文件
    [manager moveItemAtPath:path toPath:resultPath error:nil];

這樣撮弧,咱們的文件就被移動走了的猛。
其他的比如,查詢文件是否存在之類的操作想虎,同學(xué)們自己去寫一下測試一下卦尊。如果只要看就都可以記住的話,那是你想的美舌厨。

NSFileManager

細(xì)心同學(xué)又發(fā)現(xiàn)了岂却,如果我的文件內(nèi)容寫錯了,怎么辦裙椭,NSFileManager幫不了躏哩。不用怕,NSFileManager 還有一個表弟##NSFileHandle 可以很好的幫助你揉燃。
NSFileHandle 又叫做文件對接器扫尺,針對的是文件內(nèi)容的讀寫操作。通過NSdata對文件內(nèi)容進(jìn)行改變炊汤。
NSFileManager 不向他表哥一樣正驻,方法不多。用到的基本有這幾個:

//對文件需要做哪一類操作
+ (nullable instancetype)fileHandleForReadingAtPath:(NSString *)path;
+ (nullable instancetype)fileHandleForWritingAtPath:(NSString *)path;
+ (nullable instancetype)fileHandleForUpdatingAtPath:(NSString *)path;

//讀取文件內(nèi)容
- (NSData *)readDataToEndOfFile;
- (NSData *)readDataOfLength:(NSUInteger)length;

//寫入內(nèi)容
- (void)writeData:(NSData *)data;

//直接偏移文件的最后
- (unsigned long long)seekToEndOfFile;

//文件偏移
- (void)seekToFileOffset:(unsigned long long)offset;

//指定文件長度抢腐,多余的數(shù)據(jù)將會被清除
- (void)truncateFileAtOffset:(unsigned long long)offset;

//關(guān)閉文件
- (void)closeFile;

//應(yīng)該是刷新同步數(shù)據(jù)使用的姑曙,不太確定。暫時沒有使用
- (void)synchronizeFile;

栗子:

//1 文件路徑
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"test.txt"];
    //2 創(chuàng)建文件管理對象
    NSFileManager *manager = [NSFileManager defaultManager];
    
    //3創(chuàng)建文件
    NSString *str = @"sgdhajhdg";
    [manager createFileAtPath:path contents:[str dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
    NSLog(@"路徑 = %@",path);
    
    //4 文件內(nèi)容操作 創(chuàng)建文件對接器
    NSFileHandle *handle = [NSFileHandle fileHandleForUpdatingAtPath:path];
    
    //5 偏移插入位置
    [handle seekToFileOffset:3];
    
    NSData *resultData = [handle readDataToEndOfFile];
    NSString *str2 = [[NSString alloc]initWithData:resultData encoding:NSUTF8StringEncoding];
    NSLog(@"str2  = %@",str2);
    
    [handle seekToFileOffset:3];
    //6寫入數(shù)據(jù)
    NSString *str3 = [NSString stringWithFormat:@"你好哈%@",str2];
    [handle writeData:[str3 dataUsingEncoding:NSUTF8StringEncoding]];
    
    //7 關(guān)閉文件
    [handle closeFile];

可能看到第5步往下你會有一點迷糊迈倍,為什么不直接

[handle seekToFileOffset:3];

走了這一步之后伤靠,追加數(shù)據(jù)。按照這個思路啼染,最后得到的文件內(nèi)容是

ABC你好哈

而不是

ABC你好哈DEFG

各位同學(xué)可以自己測試一下宴合,看下結(jié)果。
還有一點需要特別注意迹鹅,

//5 偏移插入位置
    [handle seekToFileOffset:3];

這一個偏移量需要特別注意卦洽,不是隨便寫(我這是英文字符沒有問題),如果是文件里面存儲的中文字符的話徒欣,就可以出問題逐样。你要知道,你通過偏移量得到的是NSData數(shù)據(jù)打肝,NSString獲取NSData的話脂新,通常使用NSUTF8StringEncoding去解析。UTF-8一個中文字符占3個字節(jié)粗梭,那如果你偏移的不是3的倍數(shù)的話争便,解析的數(shù)據(jù)估計就會出問題。這個建議大家去看看UTF-8的知識點断医。
Demo地址鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滞乙,一起剝皮案震驚了整個濱河市奏纪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斩启,老刑警劉巖序调,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異兔簇,居然都是意外死亡发绢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門垄琐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來边酒,“玉大人,你說我怎么就攤上這事狸窘《针” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵翻擒,是天一觀的道長氓涣。 經(jīng)常有香客問我,道長韭寸,這世上最難降的妖魔是什么春哨? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮恩伺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘椰拒。我一直安慰自己晶渠,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布燃观。 她就那樣靜靜地躺著褒脯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缆毁。 梳的紋絲不亂的頭發(fā)上番川,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音脊框,去河邊找鬼颁督。 笑死浇雹,一個胖子當(dāng)著我的面吹牛沉御,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昭灵,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼试疙!你這毒婦竟也來了诵棵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤祝旷,失蹤者是張志新(化名)和其女友劉穎非春,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缓屠,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡奇昙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了敌完。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片储耐。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖滨溉,靈堂內(nèi)的尸體忽然破棺而出什湘,到底是詐尸還是另有隱情,我是刑警寧澤晦攒,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布闽撤,位于F島的核電站,受9級特大地震影響脯颜,放射性物質(zhì)發(fā)生泄漏哟旗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一栋操、第九天 我趴在偏房一處隱蔽的房頂上張望闸餐。 院中可真熱鬧,春花似錦矾芙、人聲如沸舍沙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拂铡。三九已至,卻和暖如春葱绒,著一層夾襖步出監(jiān)牢的瞬間感帅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工哈街, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留留瞳,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓骚秦,卻偏偏與公主長得像她倘,于是被迫代替她去往敵國和親璧微。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

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

  • 一硬梁、iOS中的沙盒機(jī)制 iOS應(yīng)用程序只能對自己創(chuàng)建的文件系統(tǒng)讀取文件前硫,這個獨立、封閉荧止、安全的空間屹电,叫做沙盒。它一...
    1d5cb7cff98d閱讀 1,765評論 0 0
  • 一跃巡、iOS中的沙盒機(jī)制 iOS應(yīng)用程序只能對自己創(chuàng)建的文件系統(tǒng)讀取文件危号,這個獨立、封閉素邪、安全的空間外莲,叫做沙盒。它一...
    tzhtodd閱讀 1,276評論 0 2
  • iOS開發(fā)-文件管理(一) 一兔朦、iOS中的沙盒機(jī)制 iOS應(yīng)用程序只能對自己創(chuàng)建的文件系統(tǒng)讀取文件偷线,這個獨立、封閉...
    MacShare閱讀 1,798評論 0 6
  • 1.簡介 數(shù)據(jù)持久存儲是一種非易失性存儲沽甥,在重啟動計算機(jī)或設(shè)備后也不會丟失數(shù)據(jù)声邦。持久化技術(shù)主要用于MVC模型中的m...
    公子無禮閱讀 1,674評論 0 4
  • 簡單數(shù)據(jù)的存儲 1. 獲取沙盒的位置 也可以使用 2. 簡單數(shù)據(jù)的存儲 2.1 NSString(1)創(chuàng)建txt文...
    小鬼的世界閱讀 410評論 0 6