NSFileManager(沙盒文件管理)数据持久化 <序列化与反序列化>
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(沙盒文件管理)数据持久化 <序列化与反序列化>的更多相关文章
- NSFileManager 沙盒文件管理
文件夹创建,复制,移动,删除,检查是否存在,代码如下: 1.获取沙盒 document 路径,作为文件夹路径的基路径. NSString *document = NSSearchPathForDire ...
- iOS路径沙盒文件管理(转载)
iOS路径沙盒文件管理,看到博主总结的很好,转载过来,原文:http://www.aichengxu.com/view/35264 一.iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文 ...
- 对 JSON 数据进行序列化和反序列化
如何:对 JSON 数据进行序列化和反序列化 2017/03/30 作者 JSON(JavaScript 对象符号)是一种高效的数据编码格式,可用于在客户端浏览器和支持 AJAX 的 Web 服务之间 ...
- Json数据的序列化与反序列化的三种经常用法介绍
下面内容是本作者从官网中看对应的教程后所做的demo.其体现了作者对相关知识点的个人理解..作者才疏学浅,难免会有理解不到位的地方.. 还请各位读者批判性对待... 本文主要介绍在Json数据的序列化 ...
- 数据持久化-存取方式总结&应用沙盒&文件管理NSFileManager
iOS应用数据存储的常用方式: 1.XML属性列表 (plist归档) 2.NSUserDefaults (偏好设置) 3.NSKeyedArchiver 归档(加密形式) 4.SQLi ...
- Swift之沙盒与数据存储
应用沙盒结构分析 1.应用程序包:包含了所有的资源文件和可执行文件 2.Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录 3.tmp:保存应用运行时所需要的 ...
- iOS沙盒及数据存储
时间久了容易忘,针对沙盒的相关实用技巧做一个记录和整理. 一.iOS数据存储常用方式 1.XML属性列表(plist) 不是所有对象都可以写入: 2.Preference(偏好设置) 本质还是通过“p ...
- c#中对json数据的序列化和反序列化(笔记)
今天遇到在后台中要获取json格式数据里的某些值,网上查了些资料: string jsonstr = _vCustomerService.LoadCustomerbyNumTotalData(quer ...
- JS实现Ajax,Josn数据的序列化和反序列化---例: 省市区联动(包含get,post)
服务器端相应JOSN数据 用到序列化和反序列化----命名空间using System.Web.Script.Serialization; public void ProcessRequest(H ...
随机推荐
- PotPlayer为播放而生的专业播放器
韩国,比较牛逼的视频播放器.专注与本地视频播放,值得拥有.... 免费下载:http://yunpan.cn/cmZ5ELC6DTI8Y 访问密码 4bf1
- Spring学习进阶 (三) Spring AOP
一.是什么AOP是Aspect Oriented Programing的简称,最初被译为“面向方面编程”:AOP通过横向抽取机制为无法通过纵向继承体系进行抽象的重复性代码提供了解决方案.比如事务的控制 ...
- Swift&NodeJS 使用Alamofire进行Post(zhuan)
这篇博客主要实现Swift客户端和NodeJS后台的Post.Get请求实现. 我是一个略有点讨厌重复使用工具的人,比如这些基本功能完全可以用OC和PHP等替代,但是没办法,现在知识更新的太快啦,Sw ...
- python环境搭建-Pycharm 调整字体大小
- 现代软件工程 第十六章 【IT 行业的创新】练习与讨论
16.6.0 Xerox Parc 的成功创新和推向市场的失败 http://research.microsoft.com/en-us/um/people/blampson/Slides/AltoA ...
- 侧滑菜单SlidingMenu
想要使用SlidingMenu 需要下载文件SlidingMenu-master 并导入SlidingMenu-master中的第三方library 如图所示: 修改library里的build.gr ...
- [转]fastjson常见问题
转自fastjson wiki说明文档:https://github.com/alibaba/fastjson/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98 1. ...
- 作业4.5-2用for循环打印菱形
package lx; public class lx { public static void main(String[] args) { for(int i = 1;i <= 10 ;i++ ...
- ActiveMQ_Linux安装(一)
一.下载:apache-activemq-5.14.0-bin.tar.gz http://activemq.apache.org/activemq-5140-release.html 二.安 ...
- 51nod 1434 理解lcm
1434 区间LCM 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个整数序列S的LCM(最小公倍数)是指最小的正 ...