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

数据的种类:

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. ReflectionHelper

    public static T GetInstance<T>(Assembly assembly, string fullNamespace) { return (T)assembly.C ...

  2. ASP.NET MVC系列:为视图添加查询功能

    首先,在MoviesController里添加一个查询方法,代码如下 public ActionResult SearchIndex(string title) { //查询数据库中的电影表 var ...

  3. has no parameters and arguments were supplied

    这个问题,让Insus.NET花上不少时间与心机. 在项目中,Insus.NET是使用这个逻辑组件: <程序与数据库之间的连接桥梁和逻辑处理>http://www.cnblogs.com/ ...

  4. 从C#到Objective-C,循序渐进学习苹果开发(7)--使用FMDB对Sqlite数据库进行操作

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本篇主要开始介绍基于XCod ...

  5. iOS学习笔记——基础控件(上)

    本篇简单罗列一下一些常用的UI控件以及它们特有的属性,事件等等.由于是笔记,相比起来不会太详细 UIView 所有UI控件都继承于这个UIView,它所拥有的属性必是所有控件都拥有,这些属性都是控件最 ...

  6. js页面用定时任务通过AJAX获取后台数据,但是从这个页面跳转到其他页面后,定时任务仍然在定时请求后台

    setInterval(function(){//ajax 请求后台数据},1000);这个是A页面的定时器然后我在A页面通过其他请求跳转到其他页面之后后台发现A页面的定时器的那个请求仍然在执行为什么 ...

  7. Android 添加桌面快捷方式操作

    /** * 为程序创建桌面快捷方式 */ private void addShortcut(){ Intent shortcut = new Intent(“com.android.launcher. ...

  8. Scalaz(2)- 基础篇:随意多态-typeclass, ad-hoc polymorphism

    scalaz功能基本上由以下三部分组成: 1.新的数据类型,如:Validation, NonEmptyList ... 2.标准scala类型的延伸类型,如:OptionOps, ListOps . ...

  9. 【转】PHP调试开发工具你认识多少?

    来源:PHP100中文网(http://www.php100.com/html/itnews/PHPxinwen/2009/0902/3257.html) PHP现在已经是使用最为广泛的开源服务器端脚 ...

  10. Virtual Box和Linux的网络配置盲记

    近来可能在虚拟机重装了Linux的缘故,在用yum安装软件时出现错误,在提示上连接镜像网站时,都是"linux counldn't resolve host"这样的提示.我估计是l ...