数据持久化:  将内存中的数据按某种格式存进磁盘

数据的种类:

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的更多相关文章

  1. 数据持久化之NSKeyedArchiver

    基本的数据类型如NSString.NSDictionary.NSArray.NSData.NSNumber等可以用属性列表的方法持久化到.plist 文件中,但如果是一些自定义的类的话,属性列表的方法 ...

  2. iOS开发笔记-swift实现iOS数据持久化之归档NSKeyedArchiver

    IOS数据持久化的方式分为三种: 属性列表 (plist.NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data.第三方类库等 归档(又名 ...

  3. IOS数据持久化之归档NSKeyedArchiver

    IOS数据持久化的方式分为三种: 属性列表 (自定义的Property List .NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data ...

  4. Swift使用NSKeyedArchiver进行数据持久化保存的经验

    iOS提供了几种数据持久化保存的方法,有NSKeyedArchiver,Property List,NSUserDefaults和CoreData.我学习下来,觉得保存应用内的诸如列表,记录这些东西, ...

  5. IOS数据持久化之归档NSKeyedArchiver, NSUserDefaults,writeToFile

    //2.文件读写 //支持:NSString, NSArray , NSDictionay, NSData //注:集合(NSArray, NSDictionay)中得元素也必须是这四种类型, 才能够 ...

  6. iOS之数据持久化方案

    概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) ...

  7. iOS的数据持久化

    所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) pr ...

  8. iOS中的数据持久化方式

    iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data. 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults ...

  9. NSFileManager(沙盒文件管理)数据持久化 <序列化与反序列化>

    iOS应用程序只能在为该改程序创建的文件中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等.       默认情况下 ...

随机推荐

  1. Node魔法堂:NPM入了个门

    一.前言 NPM作为Node的模块管理和发布工具,作用与Ruby的gem.Python的pypl或setuptools.PHP的pear和.Net的Nuget一样.在当前前端工程化极速狂奔的年代,即使 ...

  2. 开源服务专题之------sshd服务安装管理及配置文件理解和安全调优

    本专题我将讨论一下开源服务,随着开源社区的日趋丰富,开源软件.开源服务,已经成为人类的一种公共资源,发展势头可谓一日千里,所以不可不知.SSHD服务,在我们的linux服务器上经常用到,很重要,涉及到 ...

  3. js 模块化历程

    作者:吕大豹 网址:http://www.cnblogs.com/lvdabao/p/js-modules-develop.html 这是一篇关于js模块化历程的长长的流水账,记录js模块化思想的诞生 ...

  4. javascript事件分类解析

    最近在学习javascript,就顺便把常用事件给大家整理整理,也让自己加深印象.不足之处欢迎各位补充. 一般事件 onclick 鼠标点击时触发此事件 ondblclick  鼠标双击时触发此事件 ...

  5. Think PHP项目在阿里云的虚拟主机上部署

    购买完万网的虚拟主机后,今天终于把以前一个项目转成了PHP项目,我用的是TP框架,阿里的虚拟主机还是很方便上手的,在把数据库导入完后,用FTP把程序文件上传到服务器上,阿里的虚拟主机(Linux主机) ...

  6. 微信开发中遇到“当前页面的url未注册”问题

    在公众号后台设置支付授权目录,完全按照规则去设定的,但是在实际测试中会出现“当前页面的url未注册”的问题,反复确认后发现目录并没有问题,唯一的区别就是大小写不同. 但是一般url不都是不区分大小写的 ...

  7. 通过泛型数据,操作SQL数据库

    本人在操作数据库的时候,采用将对象的形式操作传入数据库,经过大量百度和朋友帮助,总结出如下两个接口.用于插入数据,提取数据. 要这样操作的前提条件,就是类名和表名一致,类字段和表字段一致就可以了 // ...

  8. 【Java每日一题】20161122

    package Nov2016; import java.util.ArrayList; import java.util.Iterator; public class Ques1122 { publ ...

  9. Android中自定义ProgressBar

    <ProgressBar             android:id="@+id/more_vprogress_more"             android:layo ...

  10. Netbeans 8.0.2 For PHP继续坑

    仍然没有修复PHP好用的代码快速导航功能,坑!