沙盒:其实就是一个文件,当程序运行时,会在本地生成一个文件,文件的名字是在程序安装时随机产生的.我们叫做沙盒.
沙盒对文件夹内的数据起到了一个保护的作用,保证该应用程序访问不了其他应用程序的资源,同时其他应用程序也访问不了该应用程序的资源.
沙盒中包含的文件:
1.Documents:用来存放要长久存储的数据,如果想要对包内的资源文件夹进行修改,就必须要copy一份到Documents文件夹内.
2.XXX.app:这是我们的应用程序包,应用程序运行会从该包内读取资源,并且包内的资源是readOnly的,只能读不能写.(也就是我们通常用的NSBundle).
3.Library:用来存放缓存文件以及用户偏好设置信息,包含两个文件
(1).Caches:用来存放缓存文件,比如下载的视频,音频,缓存的图片.
(2).preferences:用来存放用户的偏好设置:比如是否是第一次启动应用程序,设置里面的切换阅读模式等用户偏好都存储在该文件夹中.
4.temp文件:用来存放临时数据.比如存放还未下载完的视频,音频,当下载完成之后,我们需要手动将资源转移到Caches文件夹内存储.
注意:以上文件都是系统自动生成的,对于开发者没有权利去删除系统创建的文件,我们只能删除自己创建的文件比如images,videos,musics等.
1.对于文件读写,系统只提供了四个类来实现文件读写(通过文件读写的方式来实现数据持久化)即NSString,NSArray,NSDictionary,NSData.当然他们的子类也可以实现文件读写.
2.写入文件的方法:writeToFile:(文件路径)
3.读取文件内容:initWithContentOfFile:(文件路径)或遍历构造器方法:arrayWithContentOfFile:(路径)
4.对于文件读写的优点:使用简单,方法简单.缺点:仅限于四个类来实现文件读写操作.
沙盒对文件夹内的数据起到了一个保护的作用,保证该应用程序访问不了其他应用程序的资源,同时其他应用程序也访问不了该应用程序的资源.
沙盒中包含的文件:
1.Documents:用来存放要长久存储的数据,如果想要对包内的资源文件夹进行修改,就必须要copy一份到Documents文件夹内.
2.XXX.app:这是我们的应用程序包,应用程序运行会从该包内读取资源,并且包内的资源是readOnly的,只能读不能写.(也就是我们通常用的NSBundle).
3.Library:用来存放缓存文件以及用户偏好设置信息,包含两个文件
(1).Caches:用来存放缓存文件,比如下载的视频,音频,缓存的图片.
(2).preferences:用来存放用户的偏好设置:比如是否是第一次启动应用程序,设置里面的切换阅读模式等用户偏好都存储在该文件夹中.
4.temp文件:用来存放临时数据.比如存放还未下载完的视频,音频,当下载完成之后,我们需要手动将资源转移到Caches文件夹内存储.
注意:以上文件都是系统自动生成的,对于开发者没有权利去删除系统创建的文件,我们只能删除自己创建的文件比如images,videos,musics等.
1.对于文件读写,系统只提供了四个类来实现文件读写(通过文件读写的方式来实现数据持久化)即NSString,NSArray,NSDictionary,NSData.当然他们的子类也可以实现文件读写.
2.写入文件的方法:writeToFile:(文件路径)
3.读取文件内容:initWithContentOfFile:(文件路径)或遍历构造器方法:arrayWithContentOfFile:(路径)
4.对于文件读写的优点:使用简单,方法简单.缺点:仅限于四个类来实现文件读写操作.
5.如果对于数组或者字典来进行文件读写时,他们里面的每一个元素也都必须是这四个类型中的任意一个类的对象.
- (NSString *)getfilePath
{
//我们要把数据持久化,要存入Doucuments文件夹下
//1.获取Doucuments文件下得路径
//NSDocumentDirectory 要获取哪个目录的路径.
//NSUserDomainMask 在哪个域中查找,因为沙盒在Users文件夹下,所以我们选择在用户域中查找.
//MAC OS 下可以有多个用户,而该方法最初用于MAC OS 下,当使用该方法时会获取到所有用户的Documents目录的路径,可能不止一个,现在我们用于ios系统,所以用户只有一个.获得路径只有一个.
NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
//拼接上数据要写入的文本文件的名字
NSString *newFilePath = [filePath stringByAppendingPathComponent:@"AA.txt"];
//NSString *newFilePath = [filePath stringByAppendingString:@"/text.txt"];
//NSLog(@"%@",newFilePath);
//NSStringEncoding 编码
return newFilePath;
}
//写入数据
- (void)read
{
//字符串读取数据:利用该类具有的能够通过文件路径创建对象的方法来读取数据
//从文件中读取数据
//NSString *str = [[NSString alloc]initWithContentsOfFile:[self getfilePath] encoding:NSUTF8StringEncoding error:nil];
//_label1.text = str;
//数组读取数据
NSArray *arr =[NSArray arrayWithContentsOfFile:[self getfilePath]];
_label1.text = [arr objectAtIndex:0];
_label2.text = [arr objectAtIndex:1];
}
//归档
- (void)archive
{
Person *per1 = [[Person alloc]initWithName:_tx1.text phoneNumber:_tx2.text];
Person *per2 = [[Person alloc]initWithName:_tx1.text phoneNumber:_tx2.text];
NSMutableData *data = [NSMutableData data];
//归档NSKeyedArchiver 原理:将自定义类的对象归档入NSMutableData的一个对象中,然后通过data来实现文件读写操作(也就是实现数据持久化).
NSKeyedArchiver *archive = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
//对per1进行归档,key标识归档的per1
[archive encodeObject:per1 forKey:@"p1"];
[archive encodeObject:per2 forKey:@"p2"];
//结束归档,也就是如果在该行代码之后再进行归档操作,则视为无效.
[archive finishEncoding];
//借助data实现数据持久化存储
[data writeToFile:[self getfilePath] atomically:YES];
[per1 release];
[per2 release];
[archive release];
}
//反归档
- (void)unarchive
{
NSData *data = [NSData dataWithContentsOfFile:[self getfilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
Person *per1=[unarchiver decodeObjectForKey:@"p1"];
//结束反归档
[unarchiver finishDecoding];
[unarchiver release];
_label1.text = per1.name;
_label2.text = per1.phoneNumber;
}
自定义Person类
.h文件
@property (nonatomic,retain)NSString *name;
@property (nonatomic,retain)NSString *phoneNumber;
- (id)initWithName:(NSString *)name phoneNumber:(NSString *)phoneNumber;
.m文件
- (id)initWithName:(NSString *)name phoneNumber:(NSString *)phoneNumber
{
self = [super init];
if (self) {
self.name =name;
self.phoneNumber = phoneNumber;
}
return self;
}
//当对象归档时,会自动调用该方法,该方法用于对对象自己的实例变量进行归档操作,切记:该方法是NSCoding协议中的方法,必须服从该协议,该方法才有效.
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeObject:_phoneNumber forKey:@"phoneNumber"];
}
//反归档.当对对象反归档的时候会自动调用该方法,对该对象的实例变量进行反归档操作.然后将反归档得到的数据封装成对象返回.
- (id)initWithCoder:(NSCoder *)aDecoder
{
NSString *name=[aDecoder decodeObjectForKey:@"name"];
NSString *phoneNumber=[aDecoder decodeObjectForKey:@"phoneNumber"];
return [self initWithName:name phoneNumber:phoneNumber];
}
- (void)dealloc
{
[_name release];
[_phoneNumber release];
[super dealloc];
}