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协议
保存文件的扩展名可以任意指定
继承时必须先调用父类的归档解档方法