什么是沙盒?

苹果为我们每个app都分配了一个固定的文件夹,我们在开发过程中可以向文件夹存入我们想要存储的数据,同时也能从这些文件夹取这些数据,但是我们不能取到其他app所存储的数据。简单说,沙盒就是这个文件夹。
沙盒是苹果的一种安全机制的设计,就是一个app只能访问该app对应的文件夹,以及一些相关的资源,两个app之间是不能共享文件的。每个app只能访问自己沙盒中的文件的。而沙盒就是一个存储app资源的地方。它主要包括bundles文件和Datas文件。而bundles文件主要是系统来管理的,我们开发app的时候主要访问Datas文件。

沙盒文件结构

documents主要存储用户产生的数据,它支持用户共享。
library主要我们在开发app的时候使用,我们可以在这里创建自己的文件夹。

获取沙盒地址

使用函数NSSearchPathForDirectoriesInDomains我们可以获取IOS的某个app的沙盒地址,它有三个参数,第一个参数是枚举参数,它可以设定获取某个具体文件夹的地址,比如document,library,或者library下的cache文件夹地址。第二个参数是设定是取用户文件夹还是系统文件夹

//得到该应用程序的沙盒地址,cache文件夹地址,用户路径下NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);NSString *cachePath = [pathArray firstObject]; //cache的地址就是第一位

IOS文件管理

在IOS文件管理中,我们最主要使用的两个类,一个是NSFileManager,一个是NSFileHandle。从这两个类的命名我们就可以猜到,NSFileManager主要功能就是文件管理,比如文件的创建,删除,移动和复制等。它不是针对文件的内容的,而是针对文件和文件夹的操作。NSFileHandle就是对NSFileManager的一个补充,可以对文件中存储的数据做截断或者追加。


这里我展示了使用NSFileManager创建GTData文件夹和list文件的操作

    //创建一个NSFileManager,用于文件的创建NSFileManager *fileManager = [NSFileManager defaultManager];//实现在cache文件夹下创建GTData 文件夹//创建文件夹路径NSString *dataPath = [cachePath stringByAppendingPathComponent:@"GTPath"];NSError *createError;//这一步才是创建操作[fileManager createDirectoryAtPath:dataPath withIntermediateDirectories:YES attributes:nil error:&createError];//在GTPath文件夹下创建list 文件//创建文件路径NSString *listDataPath = [dataPath stringByAppendingPathComponent:@"list"];//在List文件中保存abc字符串NSData *listData = [@"abc" dataUsingEncoding:NSUTF8StringEncoding];[fileManager createFileAtPath: listDataPath contents:listData attributes:nil];//查询文件__unused BOOL fileExist = [fileManager fileExistsAtPath:listDataPath];//删除指定路径下的文件if(fileExist){[fileManager removeItemAtPath:listDataPath error:nil];}

使用NSFileHandle在list文件末尾追加数据的操作

    创建fileHandler,用于文件处理,增删查改NSFileHandle *fileHandler = [NSFileHandle fileHandleForUpdatingAtPath:listDataPath];[fileHandler seekToEndOfFile]; //移动到文件末尾[fileHandler writeData:[@"def" dataUsingEncoding:NSUTF8StringEncoding]]; //添加数据[fileHandler synchronizeFile];  //立即写入磁盘[fileHandler closeFile];  //关闭文件

文件存储-序列化和反序列化

当我们从网络上请求了数据之后,我们需要把这些数据进行保存,我们可以采用苹果系统为我们提供的NSCoding协议来实现。
如果我们某个对象使用了NSCoding,需要实现其中的两个方法:

- (void)encodeWithCoder:(NSCoder *)coder;
- (nullable instancetype)initWithCoder:(NSCoder *)coder; // NS_DESIGNATED_INITIALIZER

比如,我们使用GTListItem对象数据来保存请求到的数据,我们可以使用NSCoding的子类NSKeyedArchiver来把这些数据保存起来,也可以取出。

但是,我们在使用NSKeyedArchiver对GTListItem序列化和反序列化的之前,我们需要GTListItem先支持NSSecureCoding协议,并且实现该协议指定的函数。
使用NSSecureCoding协议,我们还需要实现一个函数:

@protocol NSSecureCoding <NSCoding>
@required
// This property must return YES on all classes that allow secure coding. Subclasses of classes that adopt NSSecureCoding and override initWithCoder: must also override this method and return YES.
// The Secure Coding Guide should be consulted when writing methods that decode data.
@property (class, readonly) BOOL supportsSecureCoding;
@end

从代码中我们可以看到,NSSecureCoding协议是NSCoding子协议,是安全版本的NSCoding协议。

接下来,我就展示一下我把自定义的GTListItem对象实现序列化和反序列化的操作。首先,需要增加NSSecureCoding协议。

/// 列表结构化数据 ,支持NSSecureCoding协议,可以保存GTListItem的数据
@interface GTListItem : NSObject <NSSecureCoding>@property(nonatomic,copy, readwrite) NSString *category ;
@property(nonatomic,copy, readwrite) NSString * picUrl;
@property(nonatomic,copy, readwrite) NSString * uniqueKey;
@property(nonatomic,copy, readwrite) NSString * title;
@property(nonatomic,copy, readwrite) NSString * date;
@property(nonatomic,copy, readwrite) NSString * authorName;
@property(nonatomic,copy, readwrite) NSString * articleUrl;-(void) configWithDictionary :(NSDictionary *) dictionary;@end

实现NSSecureCoding指定的协议函数

#pragma mark -NSSecureCoding-(nullable instancetype) initWithCoder:(NSCoder *)coder{if(self = [super init ]){self.category = [coder decodeObjectForKey:@"category"];self.picUrl = [coder decodeObjectForKey:@"picUrl"];self.uniqueKey = [coder decodeObjectForKey:@"uniqueKey"];self.title = [coder decodeObjectForKey:@"title"];self.date = [coder decodeObjectForKey:@"date"];self.authorName = [coder decodeObjectForKey:@"authorName"];self.articleUrl = [coder decodeObjectForKey:@"articleUrl"];}return self;
}-(void) encodeWithCoder:(NSCoder *)coder{[coder encodeObject:self.category forKey:@"category"];[coder encodeObject:self.picUrl forKey:@"picUrl"];[coder encodeObject:self.uniqueKey forKey:@"uniqueKey"];[coder encodeObject:self.title forKey:@"title"];[coder encodeObject:self.date forKey:@"date"];[coder encodeObject:self.authorName forKey:@"authorName"];[coder encodeObject:self.articleUrl forKey:@"articleUrl"];
}+(BOOL) supportsSecureCoding{return YES;
}

实现NSSecureCoding之后,就可以对GTListItem对象执行序列化和反序列化了

//获取沙盒地址,存储数据,参数传入元素为GTListItem对象的数组
-(void) archiveListDataWithArray:(NSArray<GTListItem*> *)array{//得到该应用程序的沙盒地址NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);NSString *cachePath = [pathArray firstObject]; //cache的地址就是第一位//创建一个NSFileManager,用于文件的创建NSFileManager *fileManager = [NSFileManager defaultManager];//实现在cache文件夹下创建GTData 文件夹//创建文件夹路径NSString *dataPath = [cachePath stringByAppendingPathComponent:@"GTPath"];NSError *createError;//这一步才是创建操作[fileManager createDirectoryAtPath:dataPath withIntermediateDirectories:YES attributes:nil error:&createError];//在GTPath文件夹下创建list 文件//创建文件路径NSString *listDataPath = [dataPath stringByAppendingPathComponent:@"list"];//将请求回来的数据序列化为二进制文件NSData *listData = [NSKeyedArchiver archivedDataWithRootObject:array requiringSecureCoding:YES error:nil];//将该二进制文件存储在list文件里[fileManager createFileAtPath: listDataPath contents:listData attributes:nil];//把存储在list文件中的二进制数据读取出来NSData *readListData = [fileManager contentsAtPath:listDataPath];//执行反序列化id unarchiveObj = [NSKeyedUnarchiver unarchivedObjectOfClasses:[NSSet setWithObjects:[NSArray class],[GTListItem class], nil] fromData:readListData error:nil];}

以上我们就展示了把app从网络请求回来的数据以GTListItem对象的形式保存,并将该数据以二进制形式序列化保存在app的指定文件夹下,并且从指定文件夹下反序列化(取出数据)的操作。

IOS文件管理系统:沙盒、NSFileManager、NSFileHandle、NSCoding、NSKeyedArchiver解析相关推荐

  1. iOS开发:沙盒机制以及利用沙盒存储字符串、数组、字典等数据

    iOS开发:沙盒机制以及利用沙盒存储字符串.数组.字典等数据 1.初识沙盒:(1).存储在内存中的数据,程序关闭,内存释放,数据就会丢失,这种数据是临时的.要想数据永久保存,将数据保存成文件,存储到程 ...

  2. iOS数据存储——沙盒。

    iOS数据的持久化,可以通过以下途径解决 1.通过文件管理\归档来解决. 2.如果只是少量数据,可通过NSUserDefaults解决,相当于android中的sharedPreferences. 3 ...

  3. iOS 开发之沙盒机制 文件操作 (NSFielManager)

    原文链接:http://www.jianshu.com/p/349855b5a8ae iOS APP 可以在自己的沙盒里读写文件,但是,不可以访问其他 APP 的沙盒.每一个 APP 都是一个信息孤岛 ...

  4. (0051)iOS开发之沙盒(sandbox)机制和文件操作(一)

    1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. ...

  5. (0052)iOS开发之沙盒(sandbox)机制和文件操作(二)

    我们看看如何获取应用程序沙盒目录.包括真机的沙盒的目录. 1.获取程序的Home目录 NSString *homeDirectory = NSHomeDirectory(); NSLog(@" ...

  6. iOS开发之沙盒机制(SandBox)

    iOS APP可以在自己的沙盒里读写文件,但是,不可以访问其他APP的沙盒.每一个APP都是一个信息孤岛,相互是不可以进行通信的,唯独可以通过URL Scheme.沙盒里面的文件可以是照片.声音文件. ...

  7. iOS开发 清空沙盒路径下的缓存数据

    引言: 移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为 SDWebImage . 但是,离线缓存会占用手机存储空间,所以缓存清理功能基本成为资讯. ...

  8. 获取 一个文件 在沙盒Library/Caches/ 目录下的路径

    + (NSString *)getFullPathWithFile:(NSString *)urlName {          //先获取 沙盒中的Library/Caches/路径     NSS ...

  9. android 沙盒 ios,iOS中的沙盒机制

    1.应用沙盒结构分析: 应用程序包:(图中的Layer)包含了所有的资源文件和可执行文件 Documents: 保存应用运行时生成的需要出持久化的数据,iTunes同步设备会备份该目录.例如,游戏应用 ...

最新文章

  1. 2021年春季学期-信号与系统-第十四次作业参考答案
  2. Android 设置EditText光标Cursor颜色及粗细
  3. 一文详解为什么Serverless比其他软件开发方法更具优势
  4. python—多线程之线程之间共享数据(Queue)
  5. 全网最全!2021最新常用肿瘤生信数据库收藏级汇总!
  6. 获取分割后右边的字符串
  7. 格子游戏(信息学奥赛一本通-T1347)
  8. 请千万不要在 JDK 7+ 中使用这个 JSON 包了!切记
  9. UIApplication和delegate
  10. 最小生成树模板 加 例题分析 (最小生成树类型汇总)
  11. Springboot疫情防控下基于微信小程序的食堂订餐系统 毕业设计-附源码261620
  12. Polaris Office for Mac(经典办公套件)
  13. puzzle(0722)逻辑电路、蜂巢迷阵
  14. MoviePy - 中文文档4-MoviePy实战案例-追踪人脸,打马赛克
  15. 如何一次性删除PPT中所有动画效果?
  16. Android接入融云sdk流程(思路)
  17. 在小米路由器mini上安装Transmission挂BT/PT
  18. 接口进阶:接口子类实例化和策略模式
  19. 【边缘检测】Python实现SUSAN算法及使用非极大值抑制进行改进(含免费可用源代码)
  20. 3 基于matplotlib的python数据可视化——导入Excel数据绘制组合图表

热门文章

  1. golang-泛型基础篇(一)
  2. 基于西门子200smart系列化工反应釜程序 系统进行两路PID恒温升压调节
  3. 2018迅雷校园招聘客户端在线笔试B卷---输入一个有符号整数,输出该整数的反转值。
  4. 这篇文章讲了一个新科技
  5. 装机员系统下载合集(2017年贺岁版更新发布)!
  6. JavaScript实现输入圆的半径,输出周长、体积和面积的代码
  7. 云之梦php免费教学视频下载_云知梦php基础+php进阶+mysql+linux+laravel全栈工程师【百度网盘】...
  8. Android实例,实现左右滑动查看相册,图片切换器的应用
  9. 斯坦福sr860锁相放大器原理介绍
  10. 2022年全球市场锁相放大器模块总体规模、主要生产商、主要地区、产品和应用细分研究报告