数据持久化(一)--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应用程序只能在为该改程序创建的文件中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. 默认情况下 ...
随机推荐
- 经验分享:CSS浮动(float,clear)通俗讲解
很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身理解能力差,也可能是没能遇到一篇通俗的教程. 前些天小菜终于搞懂了浮动的基本原理,迫不及待的分享给大家. 写在前面的话: 由于CSS内容比较多 ...
- HTML5五种客户端离线存储方案
最近折腾HTML5游戏需要离线存储功能,便把目前可用的几种HTML5存储方式研究了下,基于HT for Web写了个综合的实例,分别利用了Cookie.WebStorage.IndexedDB以及Fi ...
- 页面置换算法 - FIFO、LFU、LRU
缓存算法(页面置换算法)-FIFO. LFU. LRU 在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO. LFU ...
- C#进行Visio二次开发之文件导出及另存Web页面
在我前面很多关于Visio的开发过程中,介绍了各种Visio的C#开发应用场景,包括对Visio的文档.模具文档.形状.属性数据.各种事件等相关的基础处理,以及Visio本身的整体项目应用,虽然时间过 ...
- QT TableWidget 应用笔记
QT TableWidget应用笔记 分类: QT2013-05-21 16:22 2561人阅读 评论(0) 收藏 举报 1.设置表头及大小 QStringList header; header&l ...
- QQ--模拟发表带图说说
发表说说之前,必须登录. 模拟QQ登录 >> http://www.cnblogs.com/deeround/p/4386629.html 发表带图说说,自然少不了上传图片,我这使用的PC ...
- C# ~ 从 XML 到 Linq 到 Linq to XML
.XML 可扩展标记语言 (Extensible Markup Language), 标记 (markup) 是关键部分,是标准通用标记语言 (Standard Generalized Markup ...
- C#使用Process调用批处理阻塞问题
PS:又见到熟悉的C#代码了,好开心,哈哈哈.这次又跳坑了,好不容易才爬起来. 公司有自己开发的一套Submit.Compile.Publish的生命周期系统. 在Compile时,需要调用外部的 ...
- 使用attrs.xml自定义属性
控件有很多属性,如android:id.android:layout_width.android:layout_height等,但是这些属性都是系统自带的属性.使用attrs.xml文件,可以自己定义 ...
- Android使用SAX解析XML(4)
util.java文件如下: package com.hzhi.my_sax; import java.io.IOException; import java.io.InputStream; impo ...