什么是沙盒?

苹果为我们每个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. const int *,const int * const和int const *有什么区别?
  2. Python每日一练0004
  3. FFPEG 转码记录------解决了有流,但是没有码率和FPS?
  4. 对layoutInflater的理解
  5. 访问不上服务器的任何端口
  6. PHP_$_SERVER中QUERY_STRING,REQUEST_URI的用法
  7. python线程池超过最大数量_讨论一下Python线程池大小设置?
  8. svn添加新项目的步骤
  9. 单片机流水灯C语言实验报告,单片机LED灯实验报告.doc
  10. win远程桌面连接服务器,WIN2016远程桌面服务器如何同时发布APP和桌面
  11. 【OP-TEE】TA的加载(超详细)
  12. 网络Sniffing原理
  13. Lambda表达式的一些相关知识理解
  14. Linux(程序设计):29---Zlib库(数据压缩与解压)
  15. 闭锁 java_Java并发编程之闭锁
  16. 【Java】JRE与JDK
  17. pytest.ini配置文件详解【pytest系列 12】
  18. 搞懂集中度分析——GIS跨学科
  19. c语言强制退出的程序
  20. 你需要什么web2.0服务?

热门文章

  1. 老鼠的6sigma改善
  2. freemind思维导图使用总结_持续更新...
  3. 什么是Essay和Article?
  4. 5809: 傻瓜电梯(思维模拟)
  5. NOIP2018酱油记
  6. *.pvr.ccz文件还原成png格式
  7. FPGA 面试经历分享
  8. 56-混沌操作法之我见:二、AO、AC指标.(2015.2.9)
  9. 《钢琴调律师 五级》 笔记
  10. React Native TEXT 组件文字显示不全 异常解决(小米文字显示不全:小米10 ,Redmi k30出现)