zoukankan      html  css  js  c++  java
  • 数据持久化(一)--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]={''};  //[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]={''};

        

        //第二步: 20个字节到buf的内存中

        fread(buf, 20, 1, fp);

        printf("读出的内容为:%s ",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("文件内容全部读完 ");

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

    }

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

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

  • 相关阅读:
    vagrant创建centos7后虚拟机磁盘爆满
    Linuxpython删除某个目录文件夹及文件的方法
    Oracle 中常用查询用户、角色、权限等SQL
    log4j2 rce几个疑惑点解惑
    2021年总结和反思
    使用grep命令,玩转代码审计寻找Sink
    VSCode使用技巧
    [转载]什么是电源的纹波,如何测量它的值,又如何抑制呢?
    【Bug system】GCC Bugzilla
    .net core3.1开始页面实时编译
  • 原文地址:https://www.cnblogs.com/hyuganatsu/p/NSKeyedArchiver.html
Copyright © 2011-2022 走看看