13.文件加载与保存

来源:互联网 发布:行知学园高田马场地址 编辑:程序博客网 时间:2024/05/29 19:22

1.属性列表

  在Cocoa中,有一类名为属性列表(property list)的对象,通常简写为plist。这些列表用来放置一些Cocoa能够处理(主要是存储到文件和从文件中加载)的对象。这些属性列表是NSArray、NSDictionary、NSString、NSDate和NSData,以及它们的可修改形态。

  1.1NSDate

    程序中经常要处理时间和日期。iPhoto知道你为狗拍照的时间,私人财物应用程序知道处理你银行报表的结账日期。NSDate类是Cocoa中用于处理日期和时间的基础(Foundation)类。

    可以使用[NSDate date]来获取当前的日期和时间,它会返回一个能自动释放的对象。因此以下这段代码

   NSDate *date = [NSDate date];

  NSLog(@"today is %@",date);

   也可以使用一些方法比较两个日期,从而对列表进行排序,还可以获取与当前时间相隔一定时差的日期。比如说,我们可能需要24小时之前的确切时间:

   NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow: -(24*60*60)];

   NSLog(@“yesterday is %@”,yesterday);

  +dataWithTimeIntervalSinceNow:接受一个NSTimeInterval参数,该参数是一个双精度值,表示以秒为单位计数的时间间隔。通过该参数可以指定时间偏移的方式:对于将来的时间,使用时间间隔的整数;对于过去的时间,使用时间间隔的负数。

  1.2NSData

    将缓冲区(buffer)的数据传输给函数是C语言中常见的操作。通常是将缓冲区的指针和长度传递给某个函数。

    Cocoa提供了NSData类,该类可以包含大量字节。可以获得数据的长度和指向字节起始位置的指针。因为NSData是一个对象,所以常规的内存管理是对它有效的。因此,如果想将数据块传递个一个函数或方法,可以通过传递一个自动释放的NSData来实现,而无须担心内存清理的问题。下面的NSData对象将保存一个普通的C字符串(一个自己序列),然后输出数据。

    const char *string = "HI there,this is a C string";

    NSData *data = [NSData dataWithBytes: length:strlen(string) + 1];

    NSLog(@"data is %@",data);

    +dataWithBytes:调用+1,它用于包含C字符串所需的尾部的零字节。还要注意NSLog输出结果末尾的00。通过包含零字节,就可以使用%s格式的说明符输出字符串  

    NSLog(@“%d byte string is '%s'”,[data length],[data bytes]);

   NSData对象是不可变的,创建后就不能改变。可以使用它们,但不能更改其中的内容。不过NSMutableData支持在数据内容中添加和删除字节。

  1.3写入和读取属性列表

     集合型属性列表类(NSArray 和NSDictionary)具有一个-writeToFile:atomically:方法,用于将属性列表的内容写入文件。NSString和NSData也具有writeToFile:atomically:方法,不过只能写出字符串或数据块。

     因此,我们可以将字符串存入一个数组,然后保存它。

    NSSarray *phrase;

    phrase = [NSArray arrayWithObjects:@“I”,@"seem",@“to”,@“be”,@“a”,@“verb”,nil];

   [phrase writeToFile:@"/tmp/verbige.txt" atomically:YES];

   其中atomically:参数的值为BOOL类型,它会1告诉Cocoa是否应该首先将1文件内容保存在临时文件中,再将该临时文件和原始文件交换。这是一种安全机制:如果在保存过程中出现意外,不会破坏原始文件。但这种安全机制需要付出一定的代价:在保存过程中,由于原始文件仍然保存在磁盘中,所以需要使用双倍的磁盘空间。应该尽量使用atomically的方式保存文件,除非保存的文件容量非常大,会占用户大量的磁盘空间。

 1.4修改对象类型

   当时用集合类从某问件读取数据时,我们无法修改数据的类型。一种解决方法是强制转换,遍历plist文件的内容并创建一个平行结构的可修改对象。不过还有另一种方法。

  类NSPropertylistSerialization。正如名字所提示的,它可以为存储和加载属性列表的行为添加很多我们需要的设定项。

   尤其注意propertyListFromData:mutablityOption:format:errorDescription:方法。它能把plist数据返回,并且能在出现异常的时候提供错误信息。

  以下是将plist数据内容以二进制形式写入文件的代码:

  NSString *error = nil;

  NSData *encodedArray = [NSPropertyListSerialization dataFromPropertyList:capitols

                 format:NSpropertyListBinaryFormat_v1_0 errorDescription:@error];

              [encodedArray writeToFile:@"/tmp/capitols.txt" atomically:YES];

  将数据读取回内存要多执行一步,即指定文件的类型。我们创建了一个指针,如果文件格式与指定的类型不同,可以换用原格式类型的指针,也可以将读取的内容转换成新的格式。

    NSPropertyListFormat propertyListForamt = NSPropertyListXMLFormat_v1_0;

     NSString *error = nil;

     NSMutableArray *capitols = [NSPropertyListSerialization propertyListFromData:data

                                                    mutabilityOption:NSPropertyListMutableContainersAndLeaces

                                                    format:&propertyListFormat

                                                   errorDescription:&error];

0 0
原创粉丝点击