数据持久化(一)--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, NSKeyedArchiverNSKeyedUnarchiver这对工具只完成序列化

                和反序列化, 写文件和读文件全部由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); 

}

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

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

posted @ 2015-11-21 14:23  向日夏  阅读(458)  评论(0编辑  收藏  举报