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];
- 13.文件加载与保存
- 文件加载与保存
- 第十五章文件加载与保存
- 《黑马程序员》 文件加载与保存
- unity 文件、图片加载与保存
- unity 文件、图片加载与保存
- 文件加载和保存
- Anfroid文件保存,加载
- 文件加载和保存
- Object-c学习笔记十六-----文件加载与保存
- 黑马程序员--Object-C文件加载与保存
- Objective-C学习笔记第十五章文件加载与保存
- OC基础回顾(十四)文件加载与保存
- Swift - 本地数据的保存与加载(使用NSCoder将对象保存到.plist文件)
- Swift - 本地数据的保存与加载(使用NSCoder将对象保存到.plist文件)
- JSON数据保存与加载
- Hive数据加载与保存
- tensorflow 模型保存与加载
- 自学中遇到问题怎么办
- python 调试 pdb
- 设计模式-Facade
- 彻底删除Kafka中的topic
- 设计模式、手势识别器
- 13.文件加载与保存
- EndNoteX7安装和简单使用教程
- jQuery和Zepto冲突问题【解决】
- Xcode的Architecture参数的意思
- UIControl及其子类
- select、poll、epoll之间的区别总结及相关资料整理
- 深度学习入门,以及它在物联网和智慧城市中的角色
- 2016年1月面试过程中碰到的问题
- <LeetCode OJ> 52. N-Queens II