数据持久化(一)--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应用程序只能在为该改程序创建的文件中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. 默认情况下 ...
随机推荐
- 开源服务专题之------sshd服务安装管理及配置文件理解和安全调优
本专题我将讨论一下开源服务,随着开源社区的日趋丰富,开源软件.开源服务,已经成为人类的一种公共资源,发展势头可谓一日千里,所以不可不知.SSHD服务,在我们的linux服务器上经常用到,很重要,涉及到 ...
- Servlet生命周期中的service方法分析
问题ServletLifeCycle中的service方法内,有super.service(request, response); 会执行this.doGet(HttpServletRequest r ...
- 使用VS Code 开发.NET Core 应用程序 部署到Linux 跨平台
使用VS Code 开发.NET Core 应用程序 部署到Linux 跨平台. 前面讲解了VSCode开发调试 .NET Core.都只是在windows下运行. .NET Core真正的核心是跨平 ...
- Java final 修饰符知识点总结
final从字面上理解含义为“最后的,最终的”.在Java中也同样表示出此种含义. final可以用来修饰变量(包括类属性.对象属性.局部变量和形参).方法(包括类方法和对象方法)和类. 1. fin ...
- iOS阶段学习第28天笔记(UIView的介绍)
iOS学习(UI)知识点整理 一.关于UIVIew 的介绍 1)概念:UIView 是用于装载并展示各类控件的大容器,是iOS中所有UI控件的基类 2)UIView 初始化实例代码 UIView * ...
- Chrome的ERR_UNSAFE_PORT解决办法
今天早上来上班照往常一样,打开我的VS,编译运行程序,打不开??又是一阵调试,断点,很快我发现不是我的程序问题,因为在IE,Firefox里都可以正常打开,唯独Chrome报错.又仔细看了下报错页面, ...
- Linux安装JDK1.8
1. 安装前,最好先删除Linux自带的OpenJDK: (1)运行java-version,会发现Linux自带的OpenJDK,运行rpm -qa | grep OpenJDK,找出自带的Open ...
- Eclipse上GIT插件EGIT使用手册
http://blog.csdn.net/luckarecs/article/details/7427605 Eclipse上GIT插件EGIT使用手册 一_安装EGIT插件 http://dow ...
- 说说这篇「我为什么从python转向go
作者 CMGS2015.05.17 15:47* 写了7891字,被143人关注,获得了97个喜欢 说说这篇「我为什么从python转向go」 字数3748 阅读24227 评论21 喜欢81 恩看了 ...
- JPA一对多循环引用的解决
说是解决,其实不是很完美的解决的,写出来只是想记录一下这个问题或者看一下有没有哪位仁兄会的,能否知道一二. 下面说说出现问题: 问题是这样的,当我查询一个一对多的实体的时候,工具直接就爆了,差不多我就 ...