iOS开发 文件路径保存

OS文件本地化处理要经过三个步骤,获得文件保存路径、根据文件的属性选择对应的存档方式,存档读档的实现。

一、获得文件保存路径

1."应用程序包": 这里面存放的是应用程序的源文件,包括资源文件和可执行文件。

NSString *path = [[NSBundle mainBundle] bundlePath];

2.Documents: 最常用的目录,iTunes同步该应用时会同步此文件夹中的内容,适合存储重要数据。

NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;

3.Library/Caches: iTunes不会同步此文件夹,适合存储体积大,不需要备份的非重要数据。

NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;

4.tmp: iTunes不会同步此文件夹,系统可能在应用没运行时就删除该目录下的文件,所以此目录适合保存应用中的一些临时文件,用完就删除。

NSString *path = NSTemporaryDirectory();

5.Library/Preferences: iTunes同步该应用时会同步此文件夹中的内容,通常保存应用的设置信息

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

二:不同的文件属性需要有不同的文件保存处理方式 

1.plist文件一般保存的文件格式

NSArray;

NSMutableArray;

NSDictionary;

NSMutableDictionary;

NSData;

NSMutableData;

NSString;

NSMutableString;

NSNumber;

NSDate;

(1)获取文件保存路径

(2)保存

[array writeToFile:fileName atomically:YES];

(3)读取

NSArray *result = [NSArray arrayWithContentsOfFile:fileName];

( 4 )注意

只有以上列出的类型才能使用plist文件存储。

存储时使用writeToFile: atomically:方法。 其中atomically表示是否需要先写入一个辅助文件,再把辅助文件拷贝到目标文件地址。这是更安全的写入文件方法,一般都写YES。

读取时使用arrayWithContentsOfFile:方法。

2.Preference 配置文件

(1)获得NSUserDefaults文件

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

(2)向文件中写入内容

[userDefaults setObject:@"AAA"forKey:@"a"];

注:[userDefaults setObject:值 forKey:关键词]

(3)同步到配置文件里

[userDefaults synchronize];

(4)读取文件

NSString *name = [userDefaults objectForKey:@“a”]; //读取配置文件中为“a”的值

BOOL sex = [userDefaults boolForKey:@"sex"];

注: 要使用对应的对象类型来读取 配置文件中的值,且需要用对应的方法。

(5)注意

偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据。

如果没有调用synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。

偏好设置会将所有数据保存到同一个文件中。即preference目录下的一个以此应用包名来命名的plist文件。

3.NSKeyedArchiver 归档

归档在iOS中是另一种形式的序列化,只要遵循了NSCoding协议的对象都可以通过它实现序列化。由于决大多数支持存储数据的Foundation和Cocoa Touch类都遵循了NSCoding协议,因此,对于大多数类来说,归档相对而言还是比较容易实现的。

(1)在需要归档的对象里遵守NSCoding协议,并且使用对应的方法

在.h文件里面遵守 NSCoding 协议

@interface Person : NSObject

在.m文件里实现 NSCoding 协议的方法

//归档

- (void)encodeWithCoder:(NSCoder *)aCoder {

[aCoder encodeObject:self.avatar forKey:@"avatar"];

[aCoder encodeObject:self.nameforKey:@"name"];

[aCoder encodeInteger:self.age forKey:@"age"];

}

//解档

- (id)initWithCoder:(NSCoder *)aDecoder {

if([superinit]) {

self.avatar = [aDecoder decodeObjectForKey:@"avatar"];

self.name= [aDecoder decodeObjectForKey:@"name"];

self.age = [aDecoder decodeIntegerForKey:@"age"];

}

returnself;

}

注: 要归档子类,必须在实现[super encodeObject:aCoder];[super initWithCoder:aDecoder];方法

(2)使用:

存档使用NSKeyedArchiver中的archiveRootObject: toFile:方法

// 1.创建文件路径

NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"person.data"];

// 2.存档到文件目录下

[NSKeyedArchiver archiveRootObject:person toFile:file];

读档需要使用NSKeyedUnarchiver 中的  unarchiveObjectWithFile: 方法

// 1.创建文件路径

NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"person.data"];

// 2.读取文件目录下的文件

Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:file];

(3)注意

必须遵循并实现NSCoding协议

保存文件的扩展名可以任意指定

继承时必须先调用父类的归档解档方法

原文地址:https://www.cnblogs.com/jianglihui/p/5519664.html