iOS应用程序只能在为该改程序创建的文件中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。       默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp,因为应用的沙盒机制,应用只能在几个目录下读写文件

1.Documents:

//保存应⽤运行时生成的需要持久化的数据,并将通过iCloud自动备份。例如,游戏应用可将游戏存档保存在该目录,iTunes备份和恢复的时候会包括此目录

2.Library:

//Library/Caches:保存应用运行时⽣成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据。比如杂志、新闻、地图应用使用的数据库缓存文件和可下载内容应该保存到这个文件夹。

//Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置) 应⽤会在该⺫录中查找应⽤的设置信息。iTunes同步设备时会备份该目录

3.tmp:

//保存应⽤运行时所需的临时数据,使⽤完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时 不会备份该目录

简单文件的写入(OC简单数据类型直接writeToFile:写入即可):

 /*
路径:
/Users/scjy/Library/Developer/CoreSimulator/Devices/E43301D4-B5C5-4940-8A8E-305EE9605C1C/data/Containers/Data/Application/04A8FA3D-D4CD-4C30-BA87-3A3429F9135B/Documents
总结:新建重名时,文件夹(Directory)不被覆盖,而文件(File)会被覆盖
*/ #import "ViewController.h" @interface ViewController ()
{
NSString *path;
}
@property(nonatomic,assign)NSFileManager *fileMgr;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// NSString *homeDirectory = NSHomeDirectory();//获取根目录,APP在手机中的目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask/*当前域中寻找路径*/, YES);
path = [paths firstObject];//NSString *p = [paths objectAtIndex:0];//获取沙盒中的document目录
NSLog(@"%@",path);
// // 获取Cache目录
// NSArray *cachePaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
// NSString *cachePath = [cachePaths firstObject];
// //获取Library目录
// NSArray *libraryPaths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
// NSString *libraryPath = [libraryPaths firstObject];
// //获取temp目录
// NSString *tmpDir = NSTemporaryDirectory();
//将字符串写入刘冠.txt,如果没有此文件,系统会先创建,再写入,如果已经存在,则覆盖原有的文件
// NSString *string = @"刘冠";
// NSString *textPath = [path stringByAppendingPathComponent:@"刘冠.txt"];//@"刘冠.plist"//属性列表文件,用于存放列表数据(比如字典)
// [string writeToFile:textPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
//将图片写入沙盒,首先需要将图片转换成data
UIImage *image = [UIImage imageNamed:@""];
NSData *data = UIImageJPEGRepresentation(image, );//CG浮动压缩质量:1
[data writeToFile:[path stringByAppendingString:@"/1.jpg"] atomically:YES];//注意这里的atomically(原子性:是否使用辅助文件,YES:先写入辅助文件,然后辅助文件再重新命名为目标文件,NO:直接写入目标文件)如果使用stringByAppendingString拼接路径,则需要在文件前加/
//文件操作
self.fileMgr = [NSFileManager defaultManager];//创建文件管理器(利用文件管理器,通过相应方法对文件操作)
// [self.fileMgr removeItemAtPath:[path stringByAppendingString:@"/1.jpg"] error:nil];
//获取某路径下所有的文件和文件夹(目录)
NSArray *docs = [self.fileMgr contentsOfDirectoryAtPath:path error:nil];
NSLog(@"目录%@",docs);
[self.fileMgr createDirectoryAtPath:[path stringByAppendingString:@"/刘冠"]/*需要创建文件夹的文件夹和路径*/ attributes:nil];//创建文件夹,如果该文件夹已存在,则不会创建新的文件夹(已弃用)
[self.fileMgr createDirectoryAtPath:[path stringByAppendingPathComponent:@"哈哈"] withIntermediateDirectories:NO attributes:nil error:nil];//创建文件夹,如果该文件夹已存在,则不会创建新的文件夹“Intermediate:中间物”
// BOOL flag = [self.fileMgr fileExistsAtPath:path];//检查文件/文件夹是否存在“Exists:存在”用于移除等操作的判断
// BOOL isD;
// BOOL flag3 = [self.fileMgr fileExistsAtPath:path isDirectory:&isD];//判断文件/文件夹是否存在,且该路径是否是文件夹
}
- (IBAction)remove:(id)sender {
//移除操作(删除)
[self.fileMgr removeItemAtPath:[path stringByAppendingString:@"/1.jpg"] error:nil];
[self.fileMgr removeItemAtPath:[path stringByAppendingString:@"/刘冠"] error:nil];
[self.fileMgr removeItemAtPath:[path stringByAppendingString:@"/哈哈"] error:nil];
// stringByAppendingString:@"/1.jpg" = stringByAppendingPathComponent:@"1.jpg"
}
- (IBAction)Copy:(id)sender {
//copy操作
if([self.fileMgr fileExistsAtPath:[path stringByAppendingString:@"/刘冠"]])//判断"刘冠"文件是否存在
{
[self.fileMgr copyItemAtPath:[path stringByAppendingString:@"/刘冠/1.jpg"] toPath:[path stringByAppendingString:@"/哈哈/4.jpg"] error:nil];//,注意:1、(源文件)必须存在,(目标文件) 必须不存在,文件名字必须要写出来,如果(目标文件) 已经存在,则复制失败 (因为不会替换已有的文件或文件夹)2、(源文件)以及(目标文件),这两个参数必须是完整的文件路径(不考虑后缀名),不能只写到文件夹 //[self.fileMgr moveItemAtPath:[path stringByAppendingString:@"/刘冠/1.jpg"] toPath:[path stringByAppendingString:@"/哈哈/2.jpg"] error:nil];/*/移动,注意事项与copy一致
}
}

复杂文件的写入(自定义类的对象类型,需要归档、解档):此时该类需要遵循<NSCoding>协议,,其实NSObject已经继承过了

实现两个方法:

当用户对该类对象进行归档时,会调用此方法,该方法主要作用是对属性的封装- (void)encodeWithCoder:(NSCoder *)aCoder

{

[aCoder encodeObject:self.name forKey:@"name"];//归档(编码)

[aCoder encodeObject:self.age forKey:@"age"];

}

当用户解档时,会调用此方法,并且取出属性的值- (id)initWithCoder:(NSCoder *)aDecoder

{

self = [super init];

if(self)

{

self.name = [aDecoder decodeObjectForKey:@"name"];//解档(解码)

self.age = [aDecoder decodeObjectForKey:@"age"];

}

return self;

}

实现代码:

     Student *student = [[Student alloc]init];
student.name = @"刘冠";
student.age = @;
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"归档.plist"];//属性列表
NSLog(@"%@",path);
/*归档*/
//准备将对象student写入到文件中,通过归档技术(操作步骤:首先新建一个data,将archiver与data关联(此刻data无数据),通过archiver归档对象(归档入data中),最后将data写入文件)
NSMutableData *data = [[NSMutableData alloc]init];//归档中间媒介,需要先把数据归档入data
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];//关联archiver与data(将data设为归档目的地)
[archiver encodeObject:student forKey:@"Student"];//归档
[archiver finishEncoding];
[data writeToFile:path atomically:YES];//数据在data中
//归档之后的数据我们是意想不到的 /*解档*/ /*应该先从路径获取data数据,然后在解档*/
NSMutableData *data1 = [[NSMutableData alloc]initWithContentsOfFile:path];
NSKeyedUnarchiver *uarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data1];//读到data1

Student *p = [uarchiver decodeObjectForKey:@"Student"];

     [uarchiver finishDecoding];//这个也要写,结束解档
19 NSLog(@"解档数据%@,%@",p.name,p.age);

另一种较为方便的归档与解档(数据持久化)

 //同时也要遵循<NSCoding>协议, 实现上面的两个方法 (这里只是不再通过data作为中间存储介质,而直接通过系统方法取实现归档与解档)
NSString *home = NSHomeDirectory();
NSString *path = [home stringByAppendingPathComponent:@"atany.archiver"];
//归档
[NSKeyedArchiver archiveRootObject:@"归档" toFile:path];
//解档
NSString *string = [NSKeyedUnarchiver unarchiveObjectWithFile:path ];
NSLog(@"%@",string);
_stu = [[Student alloc]init];
self.stu.name = @"";
[NSKeyedArchiver archiveRootObject:_stu toFile:[home stringByAppendingPathComponent:@"atany1.archiver"]];//归档
Student *stu1 = [NSKeyedUnarchiver unarchiveObjectWithFile:[home stringByAppendingPathComponent:@"atany1.archiver"]];//解档
NSLog(@"%@",stu1.name);

NSFileManager(沙盒文件管理)数据持久化 <序列化与反序列化>的更多相关文章

  1. NSFileManager 沙盒文件管理

    文件夹创建,复制,移动,删除,检查是否存在,代码如下: 1.获取沙盒 document 路径,作为文件夹路径的基路径. NSString *document = NSSearchPathForDire ...

  2. iOS路径沙盒文件管理(转载)

    iOS路径沙盒文件管理,看到博主总结的很好,转载过来,原文:http://www.aichengxu.com/view/35264 一.iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文 ...

  3. 对 JSON 数据进行序列化和反序列化

    如何:对 JSON 数据进行序列化和反序列化 2017/03/30 作者 JSON(JavaScript 对象符号)是一种高效的数据编码格式,可用于在客户端浏览器和支持 AJAX 的 Web 服务之间 ...

  4. Json数据的序列化与反序列化的三种经常用法介绍

    下面内容是本作者从官网中看对应的教程后所做的demo.其体现了作者对相关知识点的个人理解..作者才疏学浅,难免会有理解不到位的地方.. 还请各位读者批判性对待... 本文主要介绍在Json数据的序列化 ...

  5. 数据持久化-存取方式总结&应用沙盒&文件管理NSFileManager

    iOS应用数据存储的常用方式:  1.XML属性列表   (plist归档)  2.NSUserDefaults (偏好设置)  3.NSKeyedArchiver  归档(加密形式)  4.SQLi ...

  6. Swift之沙盒与数据存储

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

  7. iOS沙盒及数据存储

    时间久了容易忘,针对沙盒的相关实用技巧做一个记录和整理. 一.iOS数据存储常用方式 1.XML属性列表(plist) 不是所有对象都可以写入: 2.Preference(偏好设置) 本质还是通过“p ...

  8. c#中对json数据的序列化和反序列化(笔记)

    今天遇到在后台中要获取json格式数据里的某些值,网上查了些资料: string jsonstr = _vCustomerService.LoadCustomerbyNumTotalData(quer ...

  9. JS实现Ajax,Josn数据的序列化和反序列化---例: 省市区联动(包含get,post)

    服务器端相应JOSN数据   用到序列化和反序列化----命名空间using System.Web.Script.Serialization; public void ProcessRequest(H ...

随机推荐

  1. SQL Server使用游标或临时表遍历数据

    方法一:使用游标(此方法适用所有情况,对标结构没有特殊要求.) declare @ProductName nvarchar() declare pcurr cursor for select Prod ...

  2. JavaScript学习笔记-简单的计时钟表

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  3. 用SpringMvc实现Excel导出功能

    以前只知道用poi导出Excel,最近用了SpringMvc的Excel导出功能,结合jxl和poi实现,的确比只用Poi好,两种实现方式如下: 一.结合jxl实现: 1.引入jxl的所需jar包: ...

  4. 东大OJ-Max Area

    1034: Max Area 时间限制: 1 Sec  内存限制: 128 MB 提交: 40  解决: 6 [提交][状态][讨论版] 题目描述 又是这道题,请不要惊讶,也许你已经见过了,那就请你再 ...

  5. Linux企业集群用商用硬件和免费软件构建高可用集群PDF

    Linux企业集群:用商用硬件和免费软件构建高可用集群 目录: 译者序致谢前言绪论第一部分 集群资源 第1章 启动服务 第2章 处理数据包 第3章 编译内容 第二部分 高可用性 第4章 使用rsync ...

  6. 【前端积累】createElement createTextNode

    <!DOCTYPE html> <html><!--树根--> <head> <meta charset="utf-8"> ...

  7. iOS 监听textfield的输入(转)

    1:首先 [textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEvent ...

  8. Android 自定义Popupwindow 注意事项,手机和平板的区别

    首先自定义ppw是要继承Popupwindow 的 而要成功的显示出自定义的ppw就必须实现下面的三句代码 // 必要的三要素下面,不然popWind显示不出来 this.setContentView ...

  9. oracle修改表字段

    --添加字段 )); -- 修改字段的长度- ));

  10. 同 一个页面,不同请求路径,如何根据实际场景写JS

    场景:使用同一个“添加群成员”的页面来操作 建群页面:建群成功后,返回查看群成员页面.在建群过程中直接添加群成员并返回一个群名称的参数. 添加群成员页面:在巳有群内添加群成员,添加成功后,返回查看群成 ...