本部分介绍Foundation框架中用于数据处理的各种对象

包括:

文件管理对象

文件操作对象

数据缓存对象

JSON序列化工具对象

XML序列化工具对象


文件管理对象NSFileManager

NSFileManager提供了大量的接口帮助我们管理文件系统,如创建、删除、重命名文件等。

使用单例设计模式,获取唯一对象的方法:

+(NSFileManager*)defaultManager

文件/文件夹创建:

//创建文件-(BOOL)createFileAtPath:(NSString*)pathcontents:(NSData*)contentsattributes:(NSDictionary<NSString*,id>*)attributes//创建目录-(BOOL)createDirectoryAtPath:(NSString*)pathwithIntermediateDirectories:(BOOL)createIntermediatesattributes:(NSDictionary<NSString*,id>*)attributeserror:(NSError*_Nullable*)error//创建目录-(BOOL)createDirectoryAtURL:(NSURL*)urlwithIntermediateDirectories:(BOOL)createIntermediatesattributes:(NSDictionary<NSString*,id>*)attributeserror:(NSError*_Nullable*)error

删除:

-(BOOL)removeItemAtURL:(NSURL*)URLerror:(NSError*_Nullable*)error-(BOOL)removeItemAtPath:(NSString*)patherror:(NSError*_Nullable*)error

存在性判断:

-(BOOL)fileExistsAtPath:(NSString*)path-(BOOL)fileExistsAtPath:(NSString*)pathisDirectory:(BOOL*)isDirectory

NSFileManager还可以进行:

文件权限的判断、修改

文件的移动、拷贝

链接的创建


文件操作类NSFileHandle

NSFileHandle提供了底层文件操作的封装,能够方便对文件进行读写操作

打开文件:

+(instancetype)fileHandleForReadingAtPath:(NSString*)path+(instancetype)fileHandleForWritingAtPath:(NSString*)path+(instancetype)fileHandleForUpdatingAtPath:(NSString*)path...

关闭文件:

-(void)closeFile

读写:

-(NSData*)readDataOfLength:(NSUInteger)length-(NSData*)readDataToEndOfFile-(void)writeData:(NSData*)data

偏移量定位:

-(void)seekToFileOffset:(unsignedlonglong)offset-(unsignedlonglong)seekToEndOfFile@property(readonly)unsignedlonglongoffsetInFile


数据缓存对象NSData

NSData用于描述数据,也被称作“缓冲区对象”

通常从网络、文件、设备获得数据都是NSData类型的

+(instancetype)dataWithContentsOfFile:(NSString*)path+(instancetype)dataWithContentsOfURL:(NSURL*)aURL+(instancetype)dataWithBytes:(constvoid*)byteslength:(NSUInteger)length

常用操作:

@property(readonly)NSUIntegerlength-(BOOL)writeToFile:(NSString*)pathatomically:(BOOL)atomically-(BOOL)writeToURL:(NSURL*)aURLatomically:(BOOL)atomically

Foundation框架中的很多其他类,都提供了由NSData创建的方法,如:

-(instancetype)initWithData:(NSData*)dataencoding:(NSStringEncoding)encoding//字符串对象


JSON序列化工具类

什么是JSON?

轻量级的数据交换格式,正逐步取代XML,成为网络数据的通用格式。

基于Javascript的一个子集

易读性略差,编码手写难度大,数据量小


JSON的格式说明

对象:{}

{key1:value1, key2:value2, …}的键值对形式,可以反序列化为OC中的NSDictionary

数组:[]

[“hello”, “world”, “neusoft”, …] 可以反序列化的OC的NSArray

提示:JSON数据格式与OC中的快捷包装方法非常类似,JSON同样支持嵌套


iOS5之前,OC本身是不支持JSON解析的,使用第三方库进行解析,如:SBJson、JSONKit、TouchJson。

在iOS5开始,使用NSJSONSerialization对Json进行解析。


JSON的解析---反序列化

NSJSONSerialization的类方法用于解析JSON数据。

+(id)JSONObjectWithData:(NSData*)dataoptions:(NSJSONReadingOptions)opterror:(NSError*_Nullable*)error

解析的数据要求是NSData对象,opt是一个枚举类型:

NSJSONReadingMutableContainers:外层为可变对象

NSJSONReadingMutableLeaves:叶子节点为可变对象,如解析后的叶子端的字符串是可变的(和文档中写的不一样,不好用)

NSJSONReadingAllowFragments:允许最外层,可以不是NSArray、NSDictionary,但必须是有效的JSON Fragment,如@”123”。

0:是效率最高的一种方式,生成的都是不可变的对象


JSON的封装---序列化

NSJSONSerialization的类方法用于封装JSON数据

+(NSData*)dataWithJSONObject:(id)objoptions:(NSJSONWritingOptions)opterror:(NSError*_Nullable*)error

返回的是JSON格式的数据,通过NSData对象方法写入文件或发送到网络中。



XML序列化工具

XML格式介绍

纯文本文档、区分大小写、标记之间的数据为字符数据

有且仅有一个根元素、每个元素必须有开始和结束,属性值需要使用双引号或单引号


XML解析的方法

SAX,即simple API for XML,只能读不能修改,解析速度快,常用大量数据的XML在不同的平台系统上解析

DOM,即Document Object Model,不仅能读还能修改,接续速度慢,适合解析小型文档。

Cocoa中提供了NSXMLParser解析器类,使用SAX解析方法。


XML解析的过程

实例化NSXMLParser解析器对象,将XML数据传入

定义解析器的代理(控制器或代理类)

解析器解析

通过解析代理方法完成XML数据的解析


NSXMLParser的实例方法

-(instancetype)initWithContentsOfURL:(NSURL*)url;-(instancetype)initWithData:(NSData*)data;

NSXMLParser的代理属性及开始解析的方法

@property(assign)id<NSXMLParserDelegate>delegate;-(BOOL)parse;-(void)abortParsing;


NSXMLParser的代理方法(代理设计模式见设计模式部分)

开始解析XML文档

-(void)parserDidStartDocument:(NSXMLParser*)parser;

开始解析某一个元素(会遍历整个XML,识别元素节点名称)

-(void)parser:(NSXMLParser*)parserdidStartElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qualifiedNameattributes:(NSDictionary*)attributeDict;

获得文本节点中的数据(大数据会接受多次)

-(void)parser:(NSXMLParser*)parserfoundCharacters:(NSString*)string;

结束某个节点(应存储上一个代理方法中获得数据)

-(void)parser:(NSXMLParser*)parserdidEndElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qName;

解析XML文档结束

-(void)parserDidEndDocument:(NSXMLParser*)parser;

解析出错时

-(void)parser:(NSXMLParser*)parserparseErrorOccurred:(NSError*)parseError;


如:

#pragmamark-开始解析-(void)parserDidStartDocument:(NSXMLParser*)parser{if(self.contactArray==nil){self.contactArray=[NSMutableArrayarray];}else{[self.contactArrayremoveAllObjects];}}#pragmamark-开始解析某个元素-(void)parser:(NSXMLParser*)parserdidStartElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qNameattributes:(NSDictionary*)attributeDict{NSArray*elementArray=@[@"姓名",@"ID",@"公司",@"EMAIL",@"电话",@"街道",@"城区",@"城市",@"省份"];if([elementNameisEqualToString:@"联系人"]){_tmpModel=[AMContactModelcontactModel];}elseif([elementArraycontainsObject:elementName]){_tmpString=[NSMutableStringstring];}}#pragmamark-获得元素中的数据-(void)parser:(NSXMLParser*)parserfoundCharacters:(NSString*)string{[_tmpStringappendString:string];}#pragmamark-结束解析某个元素-(void)parser:(NSXMLParser*)parserdidEndElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qName{if([elementNameisEqualToString:@"联系人"]){[self.contactArrayaddObject:_tmpModel];_tmpModel=nil;}elseif([elementNameisEqualToString:@"姓名"]){_tmpModel.name=_tmpString;}elseif([elementNameisEqualToString:@"ID"]){_tmpModel.ID=_tmpString;}elseif([elementNameisEqualToString:@"公司"]){_tmpModel.company=_tmpString;}elseif([elementNameisEqualToString:@"EMAIL"]){_tmpModel.email=_tmpString;}elseif([elementNameisEqualToString:@"电话"]){_tmpModel.tel=_tmpString;}elseif([elementNameisEqualToString:@"街道"]){_tmpModel.address.street=_tmpString;}elseif([elementNameisEqualToString:@"城区"]){_tmpModel.address.district=_tmpString;}elseif([elementNameisEqualToString:@"城市"]){_tmpModel.address.city=_tmpString;}elseif([elementNameisEqualToString:@"省份"]){_tmpModel.address.province=_tmpString;}}#pragmamark-结束解析-(void)parserDidEndDocument:(NSXMLParser*)parser{if(self.delegate&&[self.delegaterespondsToSelector:@selector(contactXMLController:parserFinishWithArray:)]){[self.delegatecontactXMLController:selfparserFinishWithArray:self.contactArray];}//for(AMContactModel*modelinself.contactArray){//NSLog(@"%@",model);//}}