数据处理之文件读写
沙盒机制(SandBox)
- 沙盒:每一个iOS应用都会为自己创建一个文件系统目录(文件夹),这个独立、封闭、安全的控件,叫做沙盒。
- iOS中的沙盒机制(SandBox)
- 沙盒是一种安全体制
- 它规定了应用程序只能在为该·应该程序创建的文件夹(沙盒)内防问文件,不可以访问其它沙盒内的内容(iOS8 已经部分开发访问)
- 所有的非法代码文件都保持在这个地方,比如图片文件文本等等。
- 沙盒机制的特点
1.每个应该程序的活动范围都限定在自己的沙盒里
2.不能随意跨越自己的沙盒去访问别的应用程序的沙盒中的内容(iOS8已经部分开放)
3.应用程序向外请求或者接受数据都需要经过权限认证
应该程序的沙盒目录下的文件夹
应该程序的沙盒目录下会有三个文件夹Documents、Library(下面有Caches和Preferences目录)、tmp。
- Documents: 保存应用运行时生成的需要持久化的数据,iTunes会自动备份该目录
- 苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候回包括此目录
- Library: 存储程序的默认设置和其它状态信息
1.Library/Caches: 存放缓存文件,iTunes不会备份此目录,此目录下文件不会再应该退出删除。一般存放体积比较大,不是特别只要的资源。
2..Library/Preferences:保存应用的所有偏好设置,iOS的Setting(设置)应该会在目录中查找应用的设置信息,iTunes会自动备份该目录。注意:您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应该程序的偏好 - tmp: 保存应用运行时所需的临时数据,使用完毕后在将相应的文件从该目录删除。应该没有运行时,系统也有可能会清除该目录下的文件,iTunes不会同步该目录。iPhone重启时,该目录下的文件会被删除。
获取沙盒路径
//沙盒路径
-(void)sandBoxPaths{
//沙盒主路径
NSString* homePathString = NSHomeDirectory();
NSLog(@"homePathString--%@",homePathString);
//documents路径 ?
//第一个参数:要找寻的目标文件
//第二个参数:查找到范围(要找寻的目标文件夹的父级文件夹)
//第三个参数:文件路径是否展开
NSArray* documentsArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documents = documentsArray.firstObject;
NSLog(@"documents---%@",documents);
//Library
NSArray* libraryArray = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString* libraryPath = libraryArray.firstObject;
NSLog(@"library---%@",libraryPath);
//caches
NSArray* cachesArray = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString* cachesPath = cachesArray.firstObject;
NSLog(@"cachesPath---%@",cachesPath);
//preferences
NSString* preferences = [libraryPath stringByAppendingString:@"/preferences"];
NSLog(@"preferences---%@",preferences);
//tmp
NSString* tmpPath = NSTemporaryDirectory();
NSLog(@"tmpPath---%@",tmpPath);
}
文件的写入与读取
//文件的写入
- (void)wirteToFile{
//将一段字符串写入documents文件夹中
NSString* docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
//在上面的路径下创建一个文件路径,用来盛放文字 PathComponent不会加 /
NSString* txtPath = [docPath stringByAppendingPathComponent:@"string.txt"];
//将文字写入文件中,当文字写入文件的时候,如果文件不存在,系统会先创建,在写入;如果存在,直接写人。新的内容会将原有内存覆盖掉。
NSString* contentString = @"我是文本内容";
//写入操作
//第一个参数:文件路径
//第二个参数:原子性 YES:在写入过程中会产生一个临时文件,当内容写入完整的时候,才会将内容移动到目标文件中; NO:直接在目标文件上操作,不会产生临时文件,有可能破坏目标文件。
//encoding:字符串的编码格式
//error:如果写入出问题,这里会产生一个错误日志,一般不需要错误日志,直接赋值为nil
//error对象用来保存错误日志
NSError* error = nil;
BOOL isSuccess = [contentString writeToFile:txtPath atomically:YES encoding:NSUTF8StringEncoding error:&error];
//只知道写入的结果,没有失败过程描述
if (isSuccess) {
NSLog(@"成功");
}else{
NSLog(@"失败");
}
//有写入失败的细节描述
if (error) {
NSLog(@"写入文件错误----%@",error.description);
}else{
NSLog(@"写入成功");
}
}
//读取文件
- (void)readToFile{
//要读取文件的路径
NSString* docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
NSString* txtPath = [docPath stringByAppendingPathComponent:@"string.txt"];
//读取文件
NSString* readString = [NSString stringWithContentsOfFile:txtPath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"我是读取出来的----%@",readString);
}
数组的写入与读取
//写入数组
-(void)wirteToArray{
NSString* doc = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
NSString* path = [doc stringByAppendingPathComponent:@"array.plist"];
NSArray* array = @[@"1",@"2",@"3"];
[array writeToFile:path atomically:YES];
}
//数组读取
- (void)readArray{
//路径
NSString* docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
NSString* arrayPath =[docPath stringByAppendingPathComponent:@"array.plist"];
//读取
NSArray* array = [NSArray arrayWithContentsOfFile:arrayPath];
NSLog(@"array--%@",array);
}
读取应用程序中的的文件 以及 图片写入到文件中
//读取应用程序中的的文件,可读不可写
-(void)readAppFile{
//路径
NSString* path =[[NSBundle mainBundle] pathForResource:@"Info.plist" ofType:nil];
//读取
// NSString* string = [[NSString alloc]initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
NSDictionary* dic = [[NSDictionary alloc]initWithContentsOfFile:path];
NSLog(@"读取左侧目录栏---%@",dic);
}
//将图片写入到文件中
-(void)imageWriteToFile{
NSArray* pathArray =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//doucument路径
NSString* docPath = pathArray.firstObject;
NSString* imagePath = [docPath stringByAppendingString:@"/l.jpg"];
//图片写入
//将图片转换为NSData类型才能写入文件
UIImage* image = [UIImage imageNamed:@"l.jpg"];
//UIImage -> NSData
NSData* imageData = UIImageJPEGRepresentation(image, 1.0);
[imageData writeToFile:imagePath atomically:YES];
}