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

数据的种类:

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. CSS3 介绍

    什么是CSS3 CSS即层叠样式表(Cascading Stylesheet). 在网页制作时采用CSS技术,可以有效地对页面的布局.字体.颜色.背景和其它效果实现更加精确的控制. 只要对相应的代码做 ...

  2. 怎么让composer加速

    composer install 为什么这么慢? 下面是一个composer install(在没有composer cache的情况下)做的所有事情: [vagrant@localhost comp ...

  3. 【视频处理】YUV格式说明

    YUV,是一种颜色编码方法,Y表示明亮度(Luminance.Luma),U和V则是色度.浓度(Chrominance.Chroma). YUV,Y`UV,YCbCr,YPbPr等都可以称为YUV,彼 ...

  4. LeetCode - 46. Permutations

    46. Permutations Problem's Link -------------------------------------------------------------------- ...

  5. 仿Office的程序载入窗体

    初次接触启动界面记不清是在哪一年了,估计是小学四年级第一次打开Office Word的时候吧,更记不清楚当时的启动界面是长啥样了.后来随着使用的软件越来越多,也见到各式各样的启动界面.下面就列举了两个 ...

  6. 温故而知新--sql存储过程复习

    存储过程是已编译好的T-SQL语句的集合,可以随时调用,速度快,不易出错. 可以传递参数,普通参数和输出参数(output) 实例1 create proc Newpro @testVarA int, ...

  7. 15天玩转redis —— 第三篇 无敌的列表类型

     据说60%的人使用redis看重的是redis中的list类型,那这个list有什么用呢???不用我说大家都明白,做队列使用呗,为什么用它呢,很简单呗, 因为有了它我就不需要专门的MQ产品啦,比如说 ...

  8. 【C#】第3章学习要点(二)自定义类和结构

    分类:C#.VS2015 创建日期:2016-06-19 使用教材:(十二五国家级规划教材)<C#程序设计及应用教程>(第3版) 一.要点概述 别人提供的类都是为了简化你的工作量用的,可是 ...

  9. android listview 异步加载图片并防止错位

    网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertVie ...

  10. [iOS] Delphi for iOS 版本需求

    Delphi iOS 版本需求 版本 版本需求 官网 备注 Delphi 10.1 Berlin iPod Touch, iPhone, or iPad iOS 8 iOS 9 http://docw ...