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

数据的种类:

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);

}

//********************************************

//********************************************

最新文章

  1. ASP.Net MVC开发基础学习笔记:二、HtmlHelper与扩展方法
  2. Appium+Robotframework实现Android应用的自动化测试-4:AppiumLibrary介绍和安装
  3. 在C#中使用全局鼠标、键盘Hook
  4. PHP计算一个目录文件大小方法
  5. javascript中onSubmit="return xxx()"的问题
  6. commons-logging的使用
  7. Docker 服务
  8. 【java学习】实践中总结--持续更新中
  9. 使用Anaconda虚拟环境编译caffe-gpu pycaffe
  10. kubernetes之Kubeadm快速安装v1.12.0版
  11. Python-模块导入-63
  12. Mysql建库建用户建表等常用命令
  13. cxf配置
  14. mysql优化问题汇总
  15. 面试题思考:GET和POST两种基本请求方法的区别
  16. Jenkins的安装及使用(二)
  17. Swift: Swift中Selector的变化
  18. appium+python自动化53-adb logcat查看日志
  19. 【timeisprecious】【JavaScript 】JavaScript RegExp \W 元字符
  20. SQLAlchemy和Flask-SQLAlchemy

热门文章

  1. PetaPoco - 轻量级高性能的ORM框架(支持.NET Core)
  2. web前端学习笔记---实现雪花飘落的效果
  3. 创建与使用Web API
  4. OpenSNS开发笔记(1)
  5. Oracle命名规范
  6. NanUI for Winform 使用示例【第二集】——做一个所见即所得的Markdown编辑器
  7. Widget的点击事件
  8. hibernate3
  9. Java程序,JDK的安装、环境的配置
  10. Gym 100703G---Game of numbers(DP)