数据持久化(一)--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应用程序只能在为该改程序创建的文件中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. 默认情况下 ...
随机推荐
- SQL Server代理(8/12):使用SQL Server代理外部程序
SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 在这个系列的上篇文章里,你学习如何使用SQ ...
- HT for Web列表和3D拓扑组件的拖拽应用
很多可视化编辑器都或多或少有一些拖拽功能,比如从一个List列表中拖拽一个节点到拓扑组件上进行建模,并且在拖拽的过程中鼠标位置下会附带一个被拖拽节点的缩略图,那么今天我们就来实现这样的拖拽效果. 首先 ...
- 《ASP.NET SignalR系列》第四课 SignalR自托管(不用IIS)
从现在开始相关文章请到: http://lko2o.com/moon 接着上一篇:<ASP.NET SignalR系列>第三课 SignalR的支持平台 一.概述 SignalR常常依托于 ...
- jquery删除数组中重复元素
首先定义如下数组: var arr=[0,2,3,5,6,9,2]; 我们可以看到数组中存在重复元素'2'; 最后通过jquery筛选应该得到[0,2,3,5,6,9]; ok,首先我们再定义一个空数 ...
- 基于MVC4+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出
数据的导入导出,在很多系统里面都比较常见,这个导入导出的操作,在Winform里面比较容易实现,我曾经在之前的一篇文章<Winform开发框架之通用数据导入导出操作>介绍了在Winform ...
- ajax携带状态值
- Oracle数据库,模糊查询、去重查询
分组去重查询,并执行某一个函数 :select 分组字段,聚合函数 from 表名 where 条件 group by分组字段 select 分组字段,聚合函数 from 表名 where 条件 g ...
- sublime Text-Theme
一.Spacegray主题 1>安装Spacegray主题按下Ctrl+Shift+P,输入install,选择Package Control: Install Package,然后输入Spac ...
- 泛函编程(34)-泛函变量:处理状态转变-ST Monad
泛函编程的核心模式就是函数组合(compositionality).实现函数组合的必要条件之一就是参与组合的各方程序都必须是纯代码的(pure code).所谓纯代码就是程序中的所有表达式都必须是Re ...
- python 实现登陆接口
要求: 1.输入用户名密码 2.认证成功后显示欢迎信息 3.输入三次后,锁定账户 流程图: 代码实现: #!/usr/bin/env python #!-*- coding:utf-8 -*- #!- ...