文件归档和解归档:

用途:
所谓文件归档,就是把需要存储的对象数据存储到沙盒的Documents目录下的文件中,即存储到了磁盘上,实现数据的持久性存储和备份。解归档,就是从磁盘上读取该文件下的数据,用来完成用户的需求。对象归档是将对象归档以文件的形式保存到磁盘中(也称为序列化,持久化),使用的时候读取该文件的保存路径的读取文件的内容(也称为接档,反序列化),(对象归档的文件是保密的,在磁盘上无法查看文件中的内容,而属性列表是明文的,可以查看)。
 
区别:
通过文件归档产生的文件是不可见的,如果打开归档文件的话,内容是乱码的;它不同于属性列表和plist文件是可见的,正因为不可见的缘故,使得这种持久性的数据保存更有可靠性。
 
种类:
(1)OC内置对象的单个对象归档、解归档 (2)自定义对象的单个对象归档 、解归档 (3)多个对象归档、解归档
 
步骤:
首先,获取沙盒的Documents目录,并通过拼接方式在该目录下创建一个文件夹用来存储对象数据;
 
其次,准备需要归档的对象数据;
 
然后,用相应的方法对数据进行归档,即将数据存储到该文件夹下;
 
最后,用相应的方法对数据进行解归档,即从该文件夹下获取存储的数据。
 
各自需要的方法如下:
 
1、NSKeyedArchiver 归档、解归档(只适用于OC里面内置的对象)

   + (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path;//归档

   + (id)unarchiveObjectWithFile:(NSString *)path;//接归档

2、NSKeyedArchiver 归档、解归档(自定义的对象,必须要实现<NSCoding>协议)

  - (void)encodeWithCoder:(NSCoder *)aCoder;//归档的协议方法,序列化

  - (id)initWithCoder:(NSCoder *)aDecoder;//解归档的协议方法,反序列化

  + (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path;//归档

  + (id)unarchiveObjectWithFile:(NSString *)path;//接归档

3、对多个对象进行归档、解归档

  - (instancetype)initForWritingWithMutableData:(NSMutableData *)data;//用一个可变的data创建归档对象

  - (void)encodeObject:(id)objv forKey:(NSString *)key;//将对象归档

  - (void)finishDecoding//完成归档(必须执行)

  - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile//将数据写进归档文件中

  - (instancetype)initForReadingWithData:(NSData *)data;//用一个data创建解归档对象,这个data由文件中获取而来

  - (id)decodeObjectForKey:(NSString *)key;//解归档

文件归档和解归档的使用:

一、对内置单个对象进行归档和解归档

1.获取归档文件的路径(归档文件名可以自己随意取名)

       NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

       NSString *documentPath = [documents lastObject];

       NSString *archiveFileName = [documentPath stringByAppendingPathComponent:@"array.arc"];

2.准备归档的对象数据   

     NSArray *array = @[@,@,@,@,@,@];

3.对数据进行归档(根据flag标识进行判断,如果返回的是YES,归档成功;反之,归档失败)

     if([NSKeyedArchiver archiveRootObject:array toFile:archiveFileName])

      {

          NSLog(@"归档对象成功");

      } 

4.对数据进行解归档

    NSArray *array2 = [NSKeyedUnarchiver unarchiveObjectWithFile:archiveFileName];

二、对自定义的单个对象进行归档和解归档(由于自定义对象不具有归档的性质,所以要实现归档和解归档,首先必须实现<NSCoding>协议)

1.自定义一个归档对象类,实现协议

Person.h  

 #import <Foundation/Foundation.h>
@interface Person : NSObject<NSCoding>
@property (copy,nonatomic)NSString *name;
@property (assign,nonatomic)NSInteger age;
@property (assign,nonatomic)char gender;
-(id)initWithName:(NSString*)name andAge:(NSInteger)age andChar:(char)gender;
@end

Person.m

 #import "Person.h"
@implementation Person
-(id)initWithName:(NSString*)name andAge:(NSInteger)age andChar:(char)gender
{
self = [super init];
if(self)
{
_name = [name copy];
_age = age;
_gender = gender;
}
return self;
}
-(NSString*)description
{
return [NSString stringWithFormat:@"name:%@,age:%ld,gender:%c",_name,_age,_gender];
}
#pragma mark -<NSCoding>
//归档的协议方法
-(void)encodeWithCoder:(NSCoder *)aCoder//将归档对象序列化
{
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeInteger:_age forKey:@"age"];
[aCoder encodeInt:_gender forKey:@"gender"];
}
//解归档的协议方法
-(id)initWithCoder:(NSCoder *)aDecoder //将归档对象反序列化
{
self = [super init];
if(self)
{
_name = [[aDecoder decodeObjectForKey:@"name"] copy];
_age = [aDecoder decodeIntegerForKey:@"age"];
_gender = [aDecoder decodeIntForKey:@"gender"];
}
return self;
}
@end

2.获取归档文件的路径(归档文件名可以自己随意取名)

1 NSString *homePath = NSHomeDirectory();

 NSString *documentPath = [homePath stringByAppendingPathComponent:@"documents"];

 NSString *arcviFileName = [documentPath stringByAppendingPathComponent:@"person.arc"];

3.创建该类归档对象并将其初始化 

 Person *person = [[Person alloc]initWithName:@"Tom" andAge: andChar:'M'];

4.将归档对象归档 

 if([NSKeyedArchiver archiveRootObject:person toFile:arcviFileName])
{
NSLog(@"归档成功");
}
else
{
NSLog(@"归档失败");
}

5.将归档的对象解归档

 Person *person2 = [NSKeyedUnarchiver unarchiveObjectWithFile:arcviFileName];

三、对多个对象进行归档和解归档(前面的两种方式都是针对于单个对象进行归档和解归档,如果需要对多个对象进行归档,它们就无用武之地了,局限性很大,因此,这里介绍一个新的归档方式,多对象归档和解归档)

1.获取的文件路径(归档文件名可以自己随意取名)

 NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [documents lastObject];
NSString *archiveFileName = [documentPath stringByAppendingPathComponent:@"objects.arc"];

2.准备要归档的多个归档对象数据

 NSString *useName = @"admin";
NSArray *scores = @[@,@,@90.5,@];
NSString *adress = @"北京市昌平区东三旗";

3.对归档对象进行归档

   //归档多个对象(将多个对象读到data中)
//1.用一个可变的data对象创建归档对象
NSMutableData *data = [[NSMutableData alloc]init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data]; //2.归档多个对象
[archiver encodeObject:useName forKey:@"userName"];
[archiver encodeObject:scores forKey:@"scores"];
[archiver encodeObject:adress forKey:@"adress"]; //3.完成归档(必须要实现的方法,要不然归档失败)
[archiver finishEncoding]; //4.将可变的data写进文件
[data writeToFile:archiveFileName atomically:YES]; 说明:这种归档方式,其实就是先将所有的要归档的对象先存入到一个可变的NSMutableData对象data中,然后通过data创建的归档对象将data的数据归档到归档文件中就是了。

4.将归档对象进行解归档

     //解归档多个对象
//1.从文件中读出一个data
NSData *data2 = [NSData dataWithContentsOfFile:archiveFileName];
//2.由data创建解归档对象
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data2]; //3.按照key解出多个对象
NSString *userName2 = [unarchiver decodeObjectForKey:@"userName"];
NSArray *scores2 = [unarchiver decodeObjectForKey:@"scores"];
NSString *adress2 = [unarchiver decodeObjectForKey:@"adress"]; NSLog(@"uesrName:%@,scores:%@,adress:%@",userName2,scores2,adress2);
说明:这种解归档方式,其实就是从归档文件先读取data,然后通过data创建解归档对象根据指定的键将多个对象都解归档出来就是了。

演示如下:

-- ::56.563 -一个文件多个归档[:] uesrName:admin,scores:(
,
,
"90.5", ),adress:北京市昌平区东三旗

iOS:文件归档和解归档的详解和使用的更多相关文章

  1. swift 之归档和解归档

    swift 之归档和解归档 数据持久化的方式有很多种,归档是其中的一种,说起数据持久化的方式,iOS 中基本有以下几种方式:sqlite存储.coredata存储.UserDefault存储.归档.p ...

  2. 【IPHONE开发-OBJECTC入门学习】对象的归档和解归档

    转自:http://blog.csdn.net/java886o/article/details/9046967 #import <Foundation/Foundation.h> #im ...

  3. 李洪强iOS经典面试题156 - Runtime详解(面试必备)

    李洪强iOS经典面试题156 - Runtime详解(面试必备)   一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...

  4. WebService核心文件【server-config.wsdd】详解及调用示例

    WebService核心文件[server-config.wsdd]详解及调用示例 作者:Vashon 一.准备工作 导入需要的jar包: 二.配置web.xml 在web工程的web.xml中添加如 ...

  5. robots.txt文件配置和使用方法详解

    robots.txt文件,提起这个概念,可能不少站长还很陌生:什么是robots.txt文件?robots.txt文件有什么作用?如何配置robots.txt文件?如何正确使用robots.txt文件 ...

  6. DOS文件转换成UNIX文件格式详解

    转:DOS文件转换成UNIX文件格式详解 由windows平台迁移到unix系统下容易引发的问题:Linux执行脚本却提示No such file or directory dos格式文件传输到uni ...

  7. 转:关于将Java编译过的.class文件打成jar可执行文件/JAR详解

    原文链接:关于将Java编译过的.class文件打成jar可执行文件/JAR详解 如何把 java 程序编译成 .exe 文件.通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像. ...

  8. 原来Github上的README.md文件这么有意思——Markdown语言详解(sublime text2 版本)

    一直想学习 Markdown 语言,想起以前读的一篇 赵凯强 的 博客 <原来Github上的README.md文件这么有意思——Markdown语言详解>,该篇博主 使用的是Mac系统, ...

  9. express文件上传中间件Multer详解

    express文件上传中间件Multer详解 转载自:https://www.cnblogs.com/chengdabelief/p/6580874.html   Express默认并不处理HTTP请 ...

随机推荐

  1. 安装requests

    requests包让Python程序能够轻松地向网站请求信息以及检查返回的响应.要安装requests,请执行类似于下面的命令: $ pip3 install --user requests http ...

  2. XML DOM(Document Object Model)

    1.XML DOM 是用于获取.更改.添加或删除 XML 元素的标准.2.节点(XML 文档中的每个成分都是一个节点):        整个文档是一个文档节点:        每个XML元素是一个元素 ...

  3. 【WPF】ListView自定义分页

    XAML: <Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDe ...

  4. python3 怎么爬取新闻网站?

    先开个坑,以后再填吧....... import requests from bs4 import BeautifulSoup def content(url): text = requests.ge ...

  5. 【UOJ #104】【APIO 2014】Split the sequence

    http://uoj.ac/problem/104 此题的重点是答案只与切割的最终形态有关,与切割顺序无关. 设\(f(i,j)\)表示前\(i\)个元素切成\(j\)个能产生的最大贡献. \(f(i ...

  6. BZOJ1017 魔兽地图DotR (树上背包)

    一道背包的神题,用到了树上dp和背包dp,这个题的特殊性在于儿子对于父亲节点是有影响的,所以用f[i][j][k]表示第i号装备,其中用j个来合成上层装备,花费k元所能获得最大的力量值. 然后对于每一 ...

  7. POJ3233 Matrix Power Series 矩阵乘法

    http://poj.org/problem?id=3233 挺有意思的..学习到结构体作为变量的转移, 题意 : 给定矩阵A,求A + A^2 + A^3 + ... + A^k的结果(两个矩阵相加 ...

  8. HDU 6141 I am your Father!(最小树形图)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6141 [题目大意] 给出一个有向图,求1点为根的最小树形图使得第n个点的直接父亲编号最小 [题解] ...

  9. 【2-SAT】HDU3622-Bomb Game

    [题目大意] 给n对炸弹可以放置的位置(每个位置为一个二维平面上的点),每次放置炸弹是时只能选择这一对中的其中一个点,每个炸弹爆炸的范围半径都一样,控制爆炸的半径使得所有的爆炸范围都不相交(可以相切) ...

  10. 【最小割】BZOJ2039- [2009国家集训队]employ人员雇佣

    [题目大意] 给定n个人,每个人有一个佣金,i和j如果同时被雇佣会产生2*E(i,j)的效益,i和j如果一个被雇佣一个不被雇佣会产生E(i,j)的亏损,求最大收益. [思路] 如果没有亏损,其实非常类 ...