文件读写,归档,反归档

来源:互联网 发布:日照城市知乎 编辑:程序博客网 时间:2024/04/30 13:12
沙盒:其实就是一个文件,当程序运行时,会在本地生成一个文件,文件的名字是在程序安装时随机产生的.我们叫做沙盒.
沙盒对文件夹内的数据起到了一个保护的作用,保证该应用程序访问不了其他应用程序的资源,同时其他应用程序也访问不了该应用程序的资源.
沙盒中包含的文件:
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];}




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 四年级孩子数学计算能力差怎么办 孩子四年级数学理解能力差怎么办 孩子小学四年级数学很差怎么办 孩子做作业太慢怎么办 小学三年级数学成绩差怎么办 初一数学考了3分怎么办 初二物理太差该怎么办 三年级孩子字写的差怎么办 小学三年级数学才考86怎么办 小孩子一发脾气就打妈妈怎么办 孩子做错事不肯道歉怎么办 小孩写作业注意力不集中怎么办 六年级的数学下册差怎么办 一年级小孩做作业慢怎么办 静不下心写作业怎么办 二年级应用题太差怎么办 小学二年级数学差怎么办 小学二年级成绩差怎么办 6个月小孩爱动怎么办 儿子叛逆期我该怎么办 宝宝两岁好动不听话怎么办 生宝宝后奶水少怎么办 生了孩子没出来怎么办 孩子在学校表现不好怎么办 3岁半宝宝话太多怎么办 孩子不喜欢和小朋友玩怎么办 孩子不喜欢和小朋友说话怎么办 4岁半宝宝不听话怎么办 小孩在学校打老师怎么办 老师老找孩子时怎么办 幼儿园老师批评孩子后家长怎么办 老师跟家长吵架了怎么办 孩子在幼儿园被老师孤立怎么办 学生在幼儿园被老师欺负怎么办 小孩脚痒怎么办小窍门 小孩肚子病怎么办天天说 幼儿园幼儿信息表填错了怎么办 水浒传书孩子说看不懂怎么办 孩子丢了书老师怎么办 小朋友做错事不承认老师怎么办 教师被学生骂后怎么办