初学iOS---文件读写(沙盒,简单对象和复杂对象的本地化操作,文件管理器)

沙盒

每一个iOS应用程序都会为自己创建一个文件系统目录(文件夹),这个独立,封闭,安全的空间,叫做沙盒。

沙盒机制的特点:

  1. 每个应用程序的活动范围都限定在自己的沙盒里
  2. 不能随意跨越自己的沙盒去访问别的应用程序中沙盒中的内容(iOS8已部分开放访问)
  3. 应用程序向外请求或者接收数据都需要经过权限认证

沙盒文件

沙盒文件.png

上面这张图是我在印象笔记上总结的,下面是获取文件夹地址的相关代码:

//第一种获取文件夹地址的方式
NSString *documentPathStr = [NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES)  objectAtIndex:0];
    NSLog(@"%@", documentPathStr);

#其中 NSSearchPathForDirectoriesInDomains获取的是一个数组,而且数组只有一个元素[因为在移动端,不存在多用户问题。而PC端,涉及到多用户问题(管理员、访客)],所以可以用 objectAtIndex:0或者firstObject的方式直接获取.
// 第二种方式获取documents文件夹的路径
    // 第一步:获取沙盒主路径的地址
    NSString *homePathStr = NSHomeDirectory();
    
    NSLog(@"homePathStr ==== %@", homePathStr);

    // 第二步:在沙盒主路径后拼接Documents,拼接出来documents文件夹的路径
    NSString *documentPathStr = [homePathStr stringByAppendingPathComponent:@"Documents"];
    
    NSLog(@"documentPathStr ===== %@", documentPathStr);

简单对象本地化操作

简单对象本地化操作.png

关于简单对象的写入的步骤,大致遵循下面四步:

  1. 我要知道存到哪里,所以需要一个文件夹的路径
  1. 我要知道要存什么,所以创建一条数据
  2. 我要知道我存的东西到底放在哪里,所以创建了一条路径,路径的终点就是存数据的文件(注意:这个时候没有创建出文件,只是创建出一条路径,打印一下地址可以看到并没有显示)
  3. 准备工作做好了,开始写入的操作

具体代码:

//1.
 NSString *documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
//2.
NSString *str = @"hello world";
//3.
NSString *strPath = [documentPathStr stringByAppendingPathComponent:@"str.mp4"];
或者 NSString *newPath = [documentPath stringByAppendingString:@"/123.txt"];
//4.
[str writeToFile:strPath atomically:YES encoding:NSUTF8StringEncoding error:nil];

其他的简单对象如NSArray,NSDictionary,NSData的步骤基本类似.
#数组
 NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];
    NSArray *array = @[@"A",@"B",@"C"];
    
    NSString *newPath = [documentPath stringByAppendingPathComponent:@"/eqw.txt"];
    [array writeToFile:newPath atomically:YES];
    
    NSLog(@"*********%@",newPath);
#字典
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    
    NSDictionary *dict = @{@"张三":@"name",@"男":@"gender"};
    NSString *newPath = [documentPath stringByAppendingString:@"/zhangsan.txt"];
    [dict writeToFile:newPath atomically:YES];
    NSLog(@"********%@",newPath);
    
    NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:newPath];
    NSLog(@"%@",dic);
#NSData类型
NSData类型稍微麻烦一点,需要转化为相应的格式
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    
    UIImage *iamge = [UIImage imageNamed:@"1.jpg"];
//第二个参数为压缩系数
    NSData *data = UIImageJPEGRepresentation(iamge, 1);
    
    NSString *pathFile = [documentPath stringByAppendingString:@"/7898.jpg"];
    [data writeToFile:pathFile atomically:YES];
    
    NSLog(@"%@",pathFile);
    
    UIImage *newImage = [[UIImage alloc]initWithData:data];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:newImage];
    [self.view addSubview:imageView];

######读取

//NSString
NSString *newStr = [NSString stringWithContentsOfFile:documents encoding:4 error:nil];
    NSLog(@"%@",newStr);
//NSArray
NSArray *NewArr = [NSArray arrayWithContentsOfFile:arrPath];
    NSLog(@"数组内容:%@",NewArr);
//NSDictionary
NSDictionary *newDic = [NSDictionary dictionaryWithContentsOfFile:DicPath];
    NSLog(@"字典内容:%@",newDic);

文件管理器

    //1.初始化一个NSFileManager对象(使用单例)
    NSFileManager *manager = [NSFileManager defaultManager];
    //2.获取根路径
    NSString *rootPath = NSHomeDirectory();
    //3.创建文件
    rootPath = [rootPath stringByAppendingPathComponent:@"/Documents/man"];
    //4.创建目录
     //createDirectoryAtPath:文件路径
********withIntermediateDirectories:是否在当前路径下创建/text/myApp
    [manager createDirectoryAtPath:rootPath withIntermediateDirectories:YES attributes:nil error:nil];
    //添加并写入
    rootPath = [rootPath stringByAppendingPathComponent:@"/string.txt"];
    NSString *str = @"12345";
    [str writeToFile:rootPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
#或者可以使用另一种比较简单的创建方法
//初始化一个NSFileManager对象
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *secondPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject] stringByAppendingString:@"secondPathString.txt"]
    NSString *stringContent = @"12345";
    //第二个参数为文件的内容,由于是NSData类型,所以需要转化
    [fileManager createFileAtPath:secondPath contents:[stringContent dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
可以使用一个BOOL类型的对象接收,判断是否成功.
   #pragma mark ---- 文件管理 复制 ----  
     //创建另一个路径,然后复制
[fileManager createFileAtPath:secondPath contents:[stringContent dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
    NSString *copyPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject]stringByAppendingString:@"copyPathString.txt"];
    BOOL result = [manager copyItemAtPath:secondPath toPath:copyPath error:nil];
    if (result) {
        NSLog(@"成功");
    }else{
        NSLog(@"失败啦!!!");
    }
####注意,创建另一个路径的时候,只创建路径即可,不要创建出文件,不然会失败的..

#pragma Mark ---  文件管理 删除  ---
    //移除的是创建的文件,并不是存放的文件夹
    [FileManager removeItemAtPath:rootPath error:nil];
    
    NSLog(@"移除后路径:%@",rootPath);

复杂对象存储(归档和反归档)

如果一个对象想直接写入本地,那么这个对象需要遵守NSCoding协议

     #iOS的数据持久化方式
     *   1、属性列表(Plist文件),NSUserDefault
     *   2、归档(NSKeyedArchiver)
     *   3、数据库(SQLite、CoreData、FMDB(第三方))
// 将复杂对象归档之后存入本地
    // 第一步 : 创建一个NSMutableData,用于初始化归档工具
    NSMutableData *data = [NSMutableData data];
    NSLog(@"data ==== %@", data);
    // 第二步 : 创建一个归档工具
    NSKeyedArchiver *keyedArchiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    NSLog(@"data1 ==== %@", data);
    // 第三步 :使用归档工具 对需要归档的对象进行归档
    [keyedArchiver encodeObject:person forKey:@"person"];
    NSLog(@"data2 ==== %@", data);
    // 第四步 :结束归档
    [keyedArchiver finishEncoding];
    NSLog(@"data3 ==== %@", data);
    //第五步:写入文件
     BOOL result = [data writeToFile:path atomically:YES];
     if (result) {
        NSLog(@"归档成功:%@",path);
    }
#pragma mark- 解档并使用
    // 第一步 : 从本地获取到Data
    NSData *newData = [NSData dataWithContentsOfFile:mutableDataPath];
    // 第二步 : 通过获取到的data 创建一个解档工具
    NSKeyedUnarchiver *keyedUnarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:newData];
    // 第三步 : 创建一个person对象,接收解档结果
    Person *newPerson = [keyedUnarchiver decodeObjectForKey:@"person"];
    // 第四步 : 结束解档
    [keyedUnarchiver finishDecoding];
    #归解档是一种编码方式,不是数据本地化的方式
    # 复杂对象写入本地实际上使用的还是writeToFile 的简单写入本地的方法
    // 直接写入本地 是整存整取
    #在一个路径下存数据,最后一次存进去的东西会覆盖掉之前的

NSUserDefault

#pragma mark --- NSUserDefault ---
-(void)NSUserDefault{
    /** NSUserDefault:是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是他可以让数据自由传递的一个前提。(可以存储用户信息、夜间模式、字体大小)
     
     *  在实用NSUserDefault存储自定义对象的最初,我们必须知道可以存哪些类型的数据:
        1、NSNumber(NSInteger、float、double)
        2、NSString、NSArray、NSDictionary、BOOL、NSDate
     */
    //存
    //1、创建要存储的数组
    NSArray *array = @[@"A",@"B",@"C"];
    //2、创建NSUserDefault对象
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    [user setObject:array forKey:@"userArray"];
    NSLog(@"%@",user);
    
    //取
    NSArray *type = [user objectForKey:@"userArray"];
    NSLog(@"%@",[type objectAtIndex:2]);
}

新手小白,欢迎交流指正~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容