数据持久化(一)--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应用程序只能在为该改程序创建的文件中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. 默认情况下 ...
随机推荐
- jQuery 实现bootstrapValidator下的全局验证
前置: 引入jQuery.bootstrap.bootstrapValidator 问题描述: 项目中要求所有的表单输入框中都不能输入&符号.没有在bootstrap中找到有方法可用,只能自己 ...
- Visual Studio 2013 和 ASP.NET 预览
VS 2013预览版在2013的TechEd大会由Brain Harry正式发布.这次发布包括了一系列的新特性:工程模板.Scaffolding 升级和Web工具.当你在VS 2013创建一个新工程的 ...
- SQL Server时间粒度系列----第2节日期、周时间粒度详解
本文目录列表: 1.从MySQL提供的TO_DAYS和FROM_DAYS这对函数说起2.SQL Server日期时间粒度3.SQL Server周有关时间粒度 4.总结语 5.参考清单列表 从My ...
- 打开IE错误解决方法
1. 502.1 Internal Server Error Handle svc-Integraged has a bad module ManagedPipelineHandle解决方法:此种情况 ...
- Web API应用支持HTTPS的经验总结
在我前面介绍的WebAPI文章里面,介绍了WebAPI的架构设计方面的内容,其中提出了现在流行的WebAPI优先的路线,这种也是我们开发多应用(APP.微信.微网站.商城.以及Winform等方面的整 ...
- MVC部分视图的巧用
View视图界面 @{ Html.RenderAction("demo", "", new { id = ViewBag.id });} 请求的控制器方法 pu ...
- 修正 ListView 搜寻问题
问题:如果 SearchEdit 里已输入过搜寻字,再新建 ListView 项目后,会无法显示. 适用:Delphi XE5 源码下载:[原创]修正ListView搜寻问题.zip procedur ...
- Spark集群 + Akka + Kafka + Scala 开发(3) : 开发一个Akka + Spark的应用
前言 在Spark集群 + Akka + Kafka + Scala 开发(1) : 配置开发环境中,我们已经部署好了一个Spark的开发环境. 在Spark集群 + Akka + Kafka + S ...
- [转载]OSI七层模型详解
OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输 . 完成中继功能的节点通常称为中继系统.在OSI七层模型中,处于 ...
- redis事务详解
mysql中也存在事务的概念.其实事务的定义是一样的.一组操作的集合,作为一个整体,要么全执行,要么全不执行. redis设置事务三步骤: 开始事务 :multi 操作加入事务队列 执行事务 :exe ...