数据持久化(一)--NSKeyedArchiver
数据持久化: 将内存中的数据按某种格式存进磁盘
数据的种类:
1,结构化的数据
2, 字节流数据
结构化的数据 字节流
内存中结构化的数据 -> 磁盘, 叫: 归档
字节流 结构化
磁盘上的数据 -> 结构化到内存中, 叫: 反归档
字节流 字节流
内存中字节流的数据 -> 磁盘, 叫: 写文件
字节流 字节流
磁盘上的数据 -> 内存, 叫: 读文件
oc: 在内存中用NSData类的对象来装字节流数据
NSData类的对象具有一个写入磁盘的方法: writeToFile
oc如何将结构化的数据转换成字节流:
概念: 序列化: 在内存中将结构化的数据转成字节流数据
反序列化: 在内存中将字节流的数据还原成结构化的数据
所以: 归档 = 序列化 +写文件
反归档 = 读文件 +反序列化
//********************************************
//c语言实现文件读写
void writeDataToFileByC(void)
{
// 第一步: 打开一个文件,只写打开
FILE* fp = fopen(PATH, "w");
if (fp==NULL) {
NSLog(@"文件打开失败");
return;
}
//从终端输入,放到buf的内存区
//清内存的动作是比较耗资源
// char buf[128]={'\0'}; //[there isxxdsf afkjfakfas__________]
char buf[128];
gets(buf);
//第二步: 写文件
fwrite(buf, strlen(buf), 1, fp);
//关闭文件
fclose(fp);
}
void readDataFromFileByC(void)
{
//第一步: 打开一个文件,只读打开
FILE * fp = fopen(PATH, "r");
if (fp==NULL) {
NSLog(@"文件打开失败");
}
char buf[128]={'\0'};
//第二步: 读20个字节到buf的内存中
fread(buf, 20, 1, fp);
printf("读出的内容为:%s\n",buf);
//第三步: 关闭文件
fclose(fp);
}
//读出文件中的所有数据
void readAllDataFromFileByC(void)
{
FILE *fp=fopen(PATH, "r");
if (fp==NULL) {
NSLog(@"读文件失败");
}
char buf[128];
unsigned long int ret;
while (1) {
//将buf的内存清零
memset(buf, 0, sizeof(buf));
//从文件中读取数据放入buf的内存
ret=fread(buf, 20, 1, fp);
printf("ret=%lu",ret);
//如果返回的值不是1,就说明读到文件尾部或者发生了读错误
if (1!=ret) {
printf("%s",buf);
printf("文件内容全部读完\n");
break;
}
//将buf中的数据打印
printf("%s",buf);
}
fclose(fp);
}
void appendDataToFile(void)
{
FILE * fp = fopen(PATH, "a");
char buf[128];
while (1) {
gets(buf);
if (*buf=='q') {
break;
}
fwrite(buf, strlen(buf), 1, fp);
}
fclose(fp);
}
//********************************************
/*
归档与反归档总结:
1, 用NSKeyedArchiver归档生成的文件应该用NSKeyedUnarchiver来反归档
2, 用结构化数据的协议方法writeToFile:归档的文件应该用结构化
数据的 xxxWithContentsOfFile:方法来反归档
3, 将多种结构化的数据归档到一个文件时,只能用NSKeyedArchiver
反归档只能用NSKeyedUnarchiver
4, 用NSKeyedArchiver归档时,data必须是可变的
5, NSKeyedArchiver和NSKeyedUnarchiver这对工具只完成序列化
和反序列化, 写文件和读文件全部由NSData来完成
6, 如果其它类或自定义的类对象需要拥有归档和反归档功能,必须遵守协议()
*/
#define PATH @"/Users/wenhua/Desktop/Tomcat.plist"
#define ARRAYPATH @"/Users/wenhua/Desktop/array.xml"
#define DICTPATH @"/Users/wenhua/Desktop/dict.xml"
void archiverForNSString(void)
{
NSString* str =@"abcdefg";
// 序列化过程
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
//写文件过程
[data writeToFile:PATH atomically:YES];
}
void unarchiveForNSString(void)
{
//读文件
NSData * data = [NSData dataWithContentsOfFile:PATH];
//反序列化
NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"str: %@",str);
}
void archiverForNSArray(void)
{
NSArray * array = @[@"one",@"two",@"three",@"four"];
NSMutableData* data = [[NSMutableData alloc]init];
// NSKeyedArchiver; 归档器可以将多种结构化数据完成序列化,其中每种数据都对应一个key
//创建一个归档器,但归档器需要使用一个可变的字节流工具
NSKeyedArchiver *archiver = [[ NSKeyedArchiver alloc]initForWritingWithMutableData:data];
//序列化过程
[archiver encodeObject:array forKey:@"arrayKey"];
//让归档器结束序列化工作,
[archiver finishEncoding];
//将字节流数据写入文件
[data writeToFile:PATH atomically:YES];
}
void unarchiverForNSArray(void)
{
//第一步: 读 由NSData完成
//第二步: 反序列化 由反归档器完成
// 读文件到字节流容器中
NSData * data = [ NSData dataWithContentsOfFile:PATH];
//反归档器完成的功能是:反序列化,将字节流容器中的字节流转成结构化数据
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
//反序列化的过程,该方法返回一个结构化数据的对象
id obj = [unarchiver decodeObjectForKey:@"arrayKey"];
//判断一下反序列化后的对象是不是数组
if ([obj isKindOfClass:NSClassFromString(@"NSArray")]) {
NSLog(@"obj是一个NSArray类的对象");
}
NSLog(@"obj:%@",obj);
}
void archiverForNSDictionary(void)
{
NSDictionary *dict = @{@"1":@"one",@"2":@"two",@"3":@"three"};
//第一步: 序列化
NSMutableData *data = [[ NSMutableData alloc]init];
NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
[archiver encodeObject:dict forKey:@"dictKey"];
[archiver finishEncoding];
//第二步: 写文件
[data writeToFile:PATH atomically:YES];
}
void unarchiverForNSDictionary(void)
{
NSData * data = [ NSData dataWithContentsOfFile:PATH];
NSKeyedUnarchiver * unarchiver = [[ NSKeyedUnarchiver alloc]initForReadingWithData:data];
NSDictionary *dict = [ unarchiver decodeObjectForKey:@"dictKey"];
NSLog(@"dict:%@",dict);
}
//将数组和字典同时归档到一个文件中
void archiverForArrayAndDictionary(void)
{
NSArray* array=@[@"element1",@"element2",@"element3"];
NSDictionary* dict = @{@"key1":@"value1",@"key2":@"value2",@"key3":@"value3"};
NSMutableData* data = [[ NSMutableData alloc]init];
NSKeyedArchiver* archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
[archiver encodeObject:array forKey:@"array"];
[archiver encodeObject:dict forKey:@"dictionary"];
[archiver finishEncoding];
[data writeToFile:PATH atomically:YES];
}
//从一个文件中反归档出数组和字典
void unarchiverForArrayAndDictionary(void)
{
NSData *data = [NSData dataWithContentsOfFile:PATH];
NSKeyedUnarchiver * unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
NSArray* array=[unarchiver decodeObjectForKey:@"array"];
NSDictionary* dict = [ unarchiver decodeObjectForKey:@"dictionary"];
NSLog(@"array:%@",array);
NSLog(@"dict:%@",dict);
}
//数组的最简单的数据持久化
void writeToFileForNSArray(void)
{
NSArray * array = @[@"abc",@"123",@"xyz"];
NSLog(@"array:%p,%@",array,array);
[array writeToFile: ARRAYPATH atomically:YES];
NSArray * newArray = [ NSArray arrayWithContentsOfFile:ARRAYPATH];
NSLog(@"newArray:%p,%@",newArray,newArray);
}
void writeToFileForNSDictionary(void)
{
NSDictionary *dict = @{@"1":@"one",@"2":@"two",@"3":@"three"};
NSLog(@"dict:%p, %@",dict,dict);
[dict writeToFile:DICTPATH atomically:YES];
NSDictionary *newDict = [ NSDictionary dictionaryWithContentsOfFile:DICTPATH];
NSLog(@"newDict:%p,%@",newDict,newDict);
}
//********************************************
//********************************************
数据持久化(一)--NSKeyedArchiver的更多相关文章
- 数据持久化之NSKeyedArchiver
基本的数据类型如NSString.NSDictionary.NSArray.NSData.NSNumber等可以用属性列表的方法持久化到.plist 文件中,但如果是一些自定义的类的话,属性列表的方法 ...
- iOS开发笔记-swift实现iOS数据持久化之归档NSKeyedArchiver
IOS数据持久化的方式分为三种: 属性列表 (plist.NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data.第三方类库等 归档(又名 ...
- IOS数据持久化之归档NSKeyedArchiver
IOS数据持久化的方式分为三种: 属性列表 (自定义的Property List .NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data ...
- Swift使用NSKeyedArchiver进行数据持久化保存的经验
iOS提供了几种数据持久化保存的方法,有NSKeyedArchiver,Property List,NSUserDefaults和CoreData.我学习下来,觉得保存应用内的诸如列表,记录这些东西, ...
- IOS数据持久化之归档NSKeyedArchiver, NSUserDefaults,writeToFile
//2.文件读写 //支持:NSString, NSArray , NSDictionay, NSData //注:集合(NSArray, NSDictionay)中得元素也必须是这四种类型, 才能够 ...
- iOS之数据持久化方案
概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) ...
- iOS的数据持久化
所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) pr ...
- iOS中的数据持久化方式
iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data. 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults ...
- NSFileManager(沙盒文件管理)数据持久化 <序列化与反序列化>
iOS应用程序只能在为该改程序创建的文件中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. 默认情况下 ...
随机推荐
- linux专题三之如何悄悄破解root密码(以redhat7.2x64为例)
root用户在linux系统中拥有至高无上的权限.掌握了root密码,差不对可以对linux系统随心所欲了,当然了,root用户也不是权限最高的用户. 但是掌握了root密码,基本上够我们用了.本文将 ...
- C#:基于WMI查询USB设备信息 及 Android设备厂商VID列表
/* ---------------------------------------------------------- 文件名称:WMIUsbQuery.cs 作者:秦建辉 MSN:splashc ...
- Winform混合式开发框架的特点总结
Winform混合式开发框架,是一种支持分布式部署的应用模式,支持直接连接数据库,访问远程WCF服务,访问远程Web API服务等服务的综合性框架,根据不同的需求采用不同的数据接口,是一个适应性很广的 ...
- 使用JSLint提高JS代码质量
随着富 Web 前端应用的出现,开发人员不得不重新审视并重视 JavaScript 语言的能力和使用,抛弃过去那种只靠“复制 / 粘贴”常用脚本完成简单前端任务的模式.JavaScript 语言本身是 ...
- 关于MySql中的varchar类型
今天新开始的项目在做数据库设计,发现自己对MySql的varchar类型还不熟悉,故又上网收集资料整理如下. 1.varchar类型的变化 MySQL 数据库的varchar类型在4.1以下的版本中的 ...
- css3飞机起飞进度条
效果:http://hovertree.com/texiao/css3/27/ 源码下载:http://hovertree.com/h/bjaf/pgwql1x2.htm 本效果使用Font Awes ...
- 字典树(Trie树)
1. trie基础 (1) 是什么? Trie,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种. (2) 性质 根节点不包含字符,除根节点外每一个节点都只包含一个字符 从根节点到某一节点,路 ...
- Github的第三方验证
Github的第三方验证 随着近年来网络安全越来越受到重视,对于用户认证和用户信息保存模块的开发也提升到了一个新的高度. 一般小型网站开发的时候,由于技术水平和时间成本有限,很有可能会开发出一些或大或 ...
- ASP.NET MVC 网站开发总结(六)——简谈Json的序列化与反序列化
首先,先简单的谈一下什么是序列化与反序列化,序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通 ...
- WCF在编译出现 “错误 3 命令“时解决
如果你遇到了下面问题解决方案很简单,以管理员身份运行VS就OK了. 错误 3 命令“ mkdir %SystemDrive%\inetpub\wwwroot\servicemodelsamples m ...