1. /**
  2. 1:Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录
  3. 2:tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除
  4. 3:Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
  5. */
  6. NSArray *paths1=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory
  7. , NSUserDomainMask
  8. , YES);
  9. NSString *documentsDirect=[paths1 objectAtIndex:0];
  10. assert(1 == paths1.count);
  11. NSLog(@">>documentsDirect=%@",documentsDirect);
  12. NSArray *Librarypaths =  NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSDocumentDirectory, YES);
  13. NSString* libraryDirectory  = [Librarypaths objectAtIndex:0];
  14. NSLog(@">>Librarypaths.length =%d",[Librarypaths count]);
  15. assert(1 < Librarypaths.count);
  16. NSLog(@"libraryDirectory=%@",libraryDirectory);
  17. //如果要指定其他文件目录,比如Caches目录,需要更换目录工厂常量,上面代码其他的可不变
  18. NSArray *pathcaches=NSSearchPathForDirectoriesInDomains(NSCachesDirectory
  19. , NSUserDomainMask
  20. , YES);
  21. NSString* cacheDirectory  = [pathcaches objectAtIndex:0];
  22. NSLog(@"cacheDirectory=%@",cacheDirectory);
  23. /**
  24. 使用NSSearchPathForDirectoriesInDomains只能定位Caches目录和Documents目录。
  25. tmp目录,不能按照上面的做法获得目录了,有个函数可以获得应用的根目录
  26. */
  27. NSString *tempDir1=NSHomeDirectory() ;
  28. NSString *tempDir2=NSTemporaryDirectory();
  29. NSLog(@"tempDir1=%@",tempDir1);
  30. NSLog(@"tempDir2=%@",tempDir2);
/**
1:Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录
2:tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除
3:Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
*/
NSArray *paths1=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory
, NSUserDomainMask
, YES); NSString *documentsDirect=[paths1 objectAtIndex:0];
assert(1 == paths1.count);
NSLog(@">>documentsDirect=%@",documentsDirect); NSArray *Librarypaths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSDocumentDirectory, YES);
NSString* libraryDirectory = [Librarypaths objectAtIndex:0];
NSLog(@">>Librarypaths.length =%d",[Librarypaths count]);
assert(1 < Librarypaths.count); NSLog(@"libraryDirectory=%@",libraryDirectory); //如果要指定其他文件目录,比如Caches目录,需要更换目录工厂常量,上面代码其他的可不变
NSArray *pathcaches=NSSearchPathForDirectoriesInDomains(NSCachesDirectory
, NSUserDomainMask
, YES);
NSString* cacheDirectory = [pathcaches objectAtIndex:0];
NSLog(@"cacheDirectory=%@",cacheDirectory);
/**
使用NSSearchPathForDirectoriesInDomains只能定位Caches目录和Documents目录。 tmp目录,不能按照上面的做法获得目录了,有个函数可以获得应用的根目录
*/
NSString *tempDir1=NSHomeDirectory() ;
NSString *tempDir2=NSTemporaryDirectory();
NSLog(@"tempDir1=%@",tempDir1);
NSLog(@"tempDir2=%@",tempDir2);

归档 普通自定义对象和字节流之间的转换

 序列化 某些特定类型(NSDictionary, NSArray, NSString, NSDate, NSNumber,NSData)的数据和字节流之间(通常将其保存为plist文件)的转换

2.1 归档

如果我们需要将自定义的一个对象保存到文件,应该如何做呢?

这里引入两个东西:一个是NSCoding协议 ;另一个是NSKeyedArchiver,NSKeyedArchiver其实继承于NSCoder,可以以键值对的方式将对象的属性进行序列化和反序列化。 
具体的过程可以这样描述 通过NSKeyedArchiver 可以将实现了NSCoding协议的对象 和 字节流 相互转换 。

像一些框架中的数据类型如NSDictionary,NSArray,NSString... 都已经实现了NSCoding协议,所以可以直接对他们进行归档操作。

这里来一个比较完整的例子,一个Address类,一个User类,User类下有个Address类型的属性

  1. #import <Foundation/Foundation.h>
  2. @interface Address : NSObject<NSCoding>
  3. {
  4. NSString *country;
  5. NSString *city;
  6. }
  7. @property(nonatomic,copy) NSString *country;
  8. @property(nonatomic,copy) NSString *city;
  9. @end
#import <Foundation/Foundation.h>

@interface Address : NSObject<NSCoding>
{
NSString *country;
NSString *city;
}
@property(nonatomic,copy) NSString *country;
@property(nonatomic,copy) NSString *city;
@end
  1. #import "Address.h"
  2. @implementation Address
  3. @synthesize country;
  4. @synthesize city;
  5. - (void)encodeWithCoder:(NSCoder *)aCoder{
  6. [aCoder encodeObject:country forKey:@"country"];
  7. [aCoder encodeObject:city forKey:@"city"];
  8. }
  9. - (id)initWithCoder:(NSCoder *)aDecoder{
  10. if (self = [super init]) {
  11. [self setCountry:[aDecoder decodeObjectForKey:@"country"]];
  12. [self setCity:[aDecoder decodeObjectForKey:@"city"]];
  13. } return self;
  14. }
  15. @end
#import "Address.h"

@implementation Address
@synthesize country;
@synthesize city;
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:country forKey:@"country"];
[aCoder encodeObject:city forKey:@"city"];
}
- (id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
[self setCountry:[aDecoder decodeObjectForKey:@"country"]];
[self setCity:[aDecoder decodeObjectForKey:@"city"]];
} return self;
}
@end
  1. #import <Foundation/Foundation.h>
  2. #import "Address.h"
  3. @interface User : NSObject<NSCoding>{
  4. NSString *_name;
  5. NSString *_password;
  6. Address *_address;
  7. }
  8. @property(nonatomic,copy) NSString *name;
  9. @property(nonatomic,copy) NSString *password;
  10. @property(nonatomic,retain) Address *address;
  11. @end
#import <Foundation/Foundation.h>
#import "Address.h"
@interface User : NSObject<NSCoding>{
NSString *_name;
NSString *_password;
Address *_address;
}
@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *password;
@property(nonatomic,retain) Address *address; @end
  1. #import "User.h"
  2. @implementation User
  3. @synthesize name = _name;
  4. @synthesize password = _password;
  5. @synthesize address = _address;
  6. - (void)encodeWithCoder:(NSCoder *)aCoder{
  7. [aCoder encodeObject:_name forKey:@"name"];
  8. [aCoder encodeObject:_password forKey:@"password"];
  9. [aCoder encodeObject:_address forKey:@"address"];
  10. }
  11. - (id)initWithCoder:(NSCoder *)aDecoder{
  12. if (self = [super init]) {
  13. [self setName:[aDecoder decodeObjectForKey:@"name"]];
  14. [self setPassword:[aDecoder decodeObjectForKey:@"password"]];
  15. [self setAddress:[aDecoder decodeObjectForKey:@"address"]];
  16. }
  17. return self;
  18. }
  19. @end
#import "User.h"

@implementation User
@synthesize name = _name;
@synthesize password = _password;
@synthesize address = _address; - (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeObject:_password forKey:@"password"];
[aCoder encodeObject:_address forKey:@"address"];
}
- (id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
[self setName:[aDecoder decodeObjectForKey:@"name"]];
[self setPassword:[aDecoder decodeObjectForKey:@"password"]];
[self setAddress:[aDecoder decodeObjectForKey:@"address"]];
}
return self;
} @end

操作应用

  1. NSString *tempDir2=NSTemporaryDirectory();
  2. // Do any additional setup after loading the view, typically from a nib.
  3. Address *myAddress = [[Address alloc] init] ;
  4. myAddress.country = @"中国";
  5. myAddress.city = @"杭州";
  6. User *user = [[User alloc] init] ;
  7. user.name = @"卢克";
  8. user.password = @"lukejin";
  9. user.address = myAddress;
  10. //归档  保存的是plist的二进制数据格式
  11. NSString *path = [tempDir2 stringByAppendingPathComponent:@"user"];
  12. [NSKeyedArchiver archiveRootObject:user toFile:path];
  13. //从文档中读取
  14. User *object = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
  15. NSLog(@"object.name : %@",object.name);
 NSString *tempDir2=NSTemporaryDirectory();    

	// Do any additional setup after loading the view, typically from a nib.
Address *myAddress = [[Address alloc] init] ;
myAddress.country = @"中国";
myAddress.city = @"杭州";
User *user = [[User alloc] init] ; user.name = @"卢克";
user.password = @"lukejin";
user.address = myAddress;
//归档 保存的是plist的二进制数据格式
NSString *path = [tempDir2 stringByAppendingPathComponent:@"user"];
[NSKeyedArchiver archiveRootObject:user toFile:path]; //从文档中读取
User *object = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@"object.name : %@",object.name);
使用数据对象自带的方法,如字典类写文件:

数据:

  1. NSMutableDictionary *dataDictionary = [[NSMutableDictionary alloc] init] ;
  2. [dataDictionary setValue:[NSNumber numberWithInt:222] forKey:@"intNumber"];
  3. [dataDictionary setValue:[NSArray arrayWithObjects:@"1",@"2", nil] forKey:@"testArray"];
  NSMutableDictionary *dataDictionary = [[NSMutableDictionary alloc] init] ;
[dataDictionary setValue:[NSNumber numberWithInt:222] forKey:@"intNumber"];
[dataDictionary setValue:[NSArray arrayWithObjects:@"1",@"2", nil] forKey:@"testArray"];

写文件

  1. [dataDictionary writeToFile:@"/Users/zhoumoban/Desktop/test.plist" atomically:YES];
[dataDictionary writeToFile:@"/Users/zhoumoban/Desktop/test.plist" atomically:YES];

读文件:

  1. NSDictionary *dictionaryFromFile = [NSDictionary dictionaryWithContentsOfFile:@"/Users/zhoumoban/Desktop/test.plist"];
  2. NSLog(@"%@",[dictionaryFromFile objectForKey:@"intNumber"]);
 NSDictionary *dictionaryFromFile = [NSDictionary dictionaryWithContentsOfFile:@"/Users/zhoumoban/Desktop/test.plist"];
NSLog(@"%@",[dictionaryFromFile objectForKey:@"intNumber"]);

另外:使用NSPropertyListSerialization类。通过NSPropertyListSerialization类可以将数据对象直接转成NSData或者直接写到文件或者流中去

  1. NSString *error;
  2. NSData *xmlData = [NSPropertyListSerialization dataFromPropertyList:dataDictionary format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];
  3. if(xmlData) {
  4. NSLog(@"No error creating XML data.");
  5. [xmlData writeToFile:@"/Users/zhoumoban/Desktop/test2.plist" atomically:YES];
  6. } else {
  7. if (error) {
  8. NSLog(@"error:%@", error);
  9. // [error release];
  10. }
  11. }
  12. //读取
  13. NSDictionary *dictionaryFromFile2 = (NSDictionary *)[NSPropertyListSerialization propertyListWithData:[NSData dataWithContentsOfFile:@"/Users/zhoumoban/Desktop/test2.plist"] options:0 format:NULL error:&error];
  14. NSLog(@"===%@",[dictionaryFromFile2 objectForKey:@"intNumber"]);

iOS 各种系统文件目录 临时,缓存,document,lib,归档,序列化的更多相关文章

  1. iOS开发网络篇—数据缓存

      iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造 ...

  2. (转)苹果iOS开发者账号过期临时解决方法

    苹果iOS开发者账号过期临时解决办法 苹果iOS开发者账号一年的费用是99美金,作者最近由于各种原因,导致renew没能在账号过期之前支付好,所以在账号过期等待renew的期间,试了试一些非正常手段, ...

  3. 微信公众号弹出框在IOS最新系统中点击键盘上的“完成”导致事件无法触发问题

    微信公众号弹出框在IOS最新系统中点击键盘上的"完成"导致事件无法触发问题 问题描述 微信公众号中有项功能是弹框模态框,输入信息后保存操作.但是在IOS系统中发现,当输入内容后,点 ...

  4. Linux常用系统文件目录结构

    Linux常用系统文件目录结构 bin:全称binary,含义是二进制.该目录中存储的都是一些二进制文件,文件都是可以被运行的. dev:该目录主要存放的是外接设备,例如硬盘.其他的光盘等.在其中的外 ...

  5. Windows系统下Memcached缓存系列二:CouchbaseClient(c#客户端)的详细试用,单例模式

    在上一篇文章里面 ( Windows系统下Memcached缓存系列一:Couchbase(服务器端)和CouchbaseClient(c#客户端)的安装教程 ),我们介绍了服务器端的安装和客户端的安 ...

  6. iOS网络加载图片缓存策略之ASIDownloadCache缓存优化

    iOS网络加载图片缓存策略之ASIDownloadCache缓存优化   在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用 ...

  7. Ubuntu等Linux系统清除DNS缓存的方法

    buntu等Linux系统清除DNS缓存的方法 直接说方法: 如果系统下有nscd,那么就直接 sudo /etc/init.d/nscd restart 如果没有也没关系,网上接受的方法大都是 su ...

  8. iOS 捕获系统外异常

    iOS 捕获系统外异常 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太 ...

  9. 好系统重装助手教你清理win7系统中DNS缓存

    在我们使用电脑的过程中,有时候一个经常用的网页突然打不开了,遇到这种情况,清理一下DNS缓存就可以解决了.如何清理DNS缓存?小编这就给大家说一种最简单的方法. 1.组合键:win+R,输入cmd,点 ...

随机推荐

  1. Android基础总结(4)——广播接收器

    在Android中的每个应用程序可以对自己感兴趣的广播进行注册,这样该程序就只会接收自己所关心的广播内容,这些广播可能来自于系统的,也可能来自于其他应用程序的.Android提供了一整套完整的API, ...

  2. Android创建自定义dialog方法详解-样式去掉阴影效果

    在自定义组件时,从已有组件源码中会很大收获.就拿progressDialog来说     间接父类是dialog,想了解dialog继承结构可以去百度,或者    从构造器来说ProgressDial ...

  3. 二模10day1解题报告

    T1.阅览室(reading) 有一个0~T时间内开放的阅览室,n个读者来读书每人k本,编号和看完所需时间在输入中.其中喜欢度降序排列(不考虑数值),每个人先看喜欢的,如果没有(被人拿走了)就继续找第 ...

  4. sql 截取字符串第一次出现字符之前的数据

    截取sql 第一次出现字符之前的数据  (select left( a.ChangeProductName,charindex(',', ChangeProductName)-1)) as Chang ...

  5. C# 委托:把方法组合到一个数组中使用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  6. RPC通信(Windows版、Android版)

    1.RPC通信模型 2.调用截图 服务器端 PC客户端: Android客户端: 3.remotetea jrpcgen.jar:生成Java源文件 oncrpc.jar:框架通信调用 portmap ...

  7. Android IOS WebRTC 音视频开发总结(六一)-- 大数据解密国内实时通讯行业开发现状

    本文主要介绍国内实时通讯行业现状,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 这几年移动互联网发展势头很猛,与 ...

  8. ADO.NET中的DataReader详解

    使用特性 原理图 PS:Read()使指针下移,同时销毁上一条.所以SqlDataReader是只进的. GetValue()是找当前行中的列 SqlDataReader()特性. 1)只进的  上面 ...

  9. linux内核中的min(x, y)和max(x, y)宏定义

    /linux/include/linux/kernel.h中有min(x, y)和max(x, y)的定义如下: #define min(x, y) ({ \ typeof(x) _min1 = x; ...

  10. 【漫画解读】HDFS存储原理(转载)

    以简洁易懂的漫画形式讲解HDFS存储机制与运行原理. 一.角色出演 如上图所示,HDFS存储相关角色与功能如下: Client:客户端,系统使用者,调用HDFS API操作文件;与NN交互获取文件元数 ...