文章参考视频 http://www.tudou.com/programs/view/ToJ3eRwCrhY/
归档在我们的开发中相对来说用的还是特别多的 ,在小型文件数据的存储中,不涉及到隐私或者有失平衡的数据的时候,大多数都用这个方法来存储文件,相对于这个方法存储文件呢,我们以前还有另外一些存储方法,比如说
NSString *String = @"写入文件";
NSString *path = @"/Users/apple/Desktop/abc/test.txt";
[str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error];
if(error){
NSLog(@"写入失败:%@",[error localizedDescription]); //[error localizedDescription]打印出主要错误信息 这个在工程中没有提示 可以再打印外面写就有提示
}else{
NSLog(@"写入成功");
}
}
上面的这个NSString的写入,我们如果不通过程序,只要找到这个文件的路径并找到这个文件,我们就可以直接打开这个文件,并且可以任意写入其他数据,这个在我们程序中有时候是不希望看到的,要改变这个问题,我们就可以通过归档和接档来实现
归档有多找那个方法,具体适用那种,可以根据我们在实际使用中来决定
1.比如说我只需要归档一个比较单一的NSString的话,可以采用下面这种方法
首先我们来看看归档的写法
-(void)save:(id)sender{
NSString *homePath = NSHomeDirectory();
NSString *path = [homePath stringByAppendingPathComponent:@"save.txt"]; //将文件保存到 path这个路径下,并把文件名设置为save.txt
[NSKeyedArchiver archiveRootObject:_text.text toFile:path];
NSLog(@"保存成功");
}
NShomeDirectory 官方的解释是:
返回的路径,无论是用户或应用程序的主目录,这取决于平台。
在iOS系统中,主目录是应用程序的sandbox目录。在OS X,它是应用程序的的sandbox目录或当前用户的主目录(如果应用程序在沙箱)对于文件系统实用程序的更多信息,请参阅低级别的文件管理编程主题。
在这里你如果找不到这个文件的话,你可以直接打印出这个文件路径
NSLog(@"%@",NSHomeDirectory());
在这里注意的是 上面所说的设置文件名为 save.txt 这个整体是文件名,后面的.txt 不是文件后缀,所以我们在找到save.txt 这个文件的时候,我们打不开这个文件
然后我们来看看解归档
当我们吧文件用归档的方式写入之后,要再次得到这个文件的内容,我们就通过解归档来实现
-(void)getit:(id)sender{
NSString *homePath = NSHomeDirectory();
NSString *path = [homePath stringByAppendingPathComponent:@"save.txt"];
NSString *string = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
_text.text = string;
}
这样,我们就可以通过归档和解归档来写入和读取文件了
2.如果我们要归档的内容是 name : jason age: 20 这样的数据
考虑如下情况:
1.我们有很多不同的对象需要归档,并且对象之间可能相差很大,每次进行归档麻烦,效率也不高。
2.被归档的对象不确定有多少个。
3.希望将不同对象归档到一个文件中,易于操作。
所以,如果我们能够全部将需要归档的对象首先存放在一个空间中,然后,一次性归档。这样做,那就方便多了!
在这里就不多说了,直接贴代码
归档代码:
-(void)save:(id)sender{
NSString *homePath = NSHomeDirectory();
NSString *path = [homePath stringByAppendingPathComponent:@"save.txt"];
NSMutableData *data = [NSMutableData data]; //初始化一个可变的Data
NSKeyedArchiver *archive = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archive encodeObject:_text.text forKey:@"name"];
[archive encodeObject:_text2.text forKey:@"age"];
[archive finishEncoding];
[data writeToFile:path atomically:YES];
[archive release];
}
在这个例子中,我自己写的时候,每次我需要的文件都写不进去,但是也看过别人的文档,基本思路都是这样的,不知道为什么,如果有人知道的话,给留个言啊!!
所对应的解归档就可以写成
-(void)getit:(id)sender{
NSString *homePath = NSHomeDirectory();
NSString *path = [homePath stringByAppendingPathComponent:@"save.txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
NSKeyedUnarchiver *unArchive = [NSKeyedUnarchiver unarchiveObjectWithData:data];
_text.text = [unArchive decodeObjectForKey:@"name"];
_text2.text = [unArchive decodeObjectForKey:@"age"];
}