知识点总结,沙盒机制和沙盒文件的操作
沙盒机制,沙盒唯一的,每个程序只有一个沙盒,沙盒机制是苹果公司做的安全机制,访问需要权限,每个沙盒只能访问自己的沙盒里面的文件,不可以访问其他的沙盒,但是从iso8开始有一小部分允许访问,使用共享机制访问
对文件的操作,存,取,移动,复制,删除,写入 分为了简单读写和复杂读写
简单类型读写指的是系统的对象类型:字符串,数字,字典,数组等,字典和数组内容必须为字符串类型
其他对象可以转换为nsdata类型的二进制的数据对象存储
复杂对象类型读写指的是自定义的类对象
这里的简单对象读取和存入创建沙盒文件,可以使用writeToFile:方法来操作
这里有几点需要注意,创建文件首先要创建路径,首先获取到你要创建的文件夹路径,然后拼接你要创建的文件类型和名字,组合成字符串,然后使用方法创建。这里要注意内容文件的格式,只能是一般数据类型,例如图片等需要转换成二进制的nsdata的数据类型存储。
对文件的创建和取值也可以使用文件管理器来操作,文件管理器还可以实现,增删移动复制等操作
这里要使用文件管理器首先要创建管理器对象,然后来借助管理器操作,管理器的是一个单例
NSFileManager
使用文件管理器注意取值对象和存储对象
对文件的取值,这里的取值是对文件的内容的操作,需要使用文件接收器NSFileHandle
同样使用文件接收器需要创建接收器,接收器的创建是单例
接收器使用偏移量的方式来定位内容的位置坐标,对其进行取值和写入,这里注意的是坐标的位置和使用完毕管理器的时候记得关闭管理器
对复杂对象的操作读存
需要实现一个协议,两个方法,
NSCoding
encodeWithCoder
initWithCoder
这两个方法,是将文件进行解析的方法,不适用这两个方法的话系统会崩溃
存储的时候需要用到两个方法将其装换为二进制的数据
NSKeyedArchiver 存
NSKeyedUnarchiver 取
利用这两个类将数据进行转换,一个是转换为二进制,一个是将二进制数据转换回类对象
如果类对象里面带有属性值,需要使用对应的方法对其进行唯一的key值得存储下面会给大家写
代码部分
#warning 获取沙盒文件夹路径
//获取沙盒的路径 一个程序只有唯一个沙盒
NSLog(@"%@",NSHomeDirectory());
//获取tom的文件夹的路径 存储的主要就是临时文件
NSLog(@"%@",NSTemporaryDirectory());
//获取Document文件夹的路径 主要存储重要数据,会随时的上传到云端服务器
NSString *document = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
//获取Library路径 里面存储了两个文件一个是主要的
NSString *library = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask,YES)[0];
//获取Caches文件夹路径
NSString *caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
//获取app压缩包文件路径
NSLog(@"%@",[NSBundle mainBundle]);
#warning 一般的存储方法 writeToFile 存储普通的数据类型
#pragma mark - 一般数据类型 NSString的存储
//根据获取到的沙盒指定文件夹路径拼接我要创建的文件名字和类型,拼接成一个字符串
NSString *cachesPath = [caches stringByAppendingPathComponent:@"name.txt"];
//定义内容
NSString *str = @"舍友在旁边和对象腻歪";
//将字符串内容根据路径存储进文件夹创建文件 使用多线程 编码使用UTF8 不需要返回信息
[str writeToFile:cachesPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
//创建一个新对象,使用文件路径,读取文件里面的内容接收
NSString *cachestxt = [NSString stringWithContentsOfFile:cachesPath encoding:NSUTF8StringEncoding error:nil];
//输出验证
NSLog(@"%@",cachestxt);
#pragma mark -- 一般数据类型NSData存储
//创建一个字符串对象
NSString *str = @"打电话的去,发短信的不去";
//将其使用UTF8转换成数据类型
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
//根据要存进去的指定文件夹,创建一个文件,
NSString *strdomains = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"strdomains.txt"];
//创建并将数据存储进到这个文件里面
[data writeToFile:strdomains atomically:YES];
//创建新对象接收里面的内容
NSData *datan = [NSData dataWithContentsOfFile:strdomains];
//将数据类型转换为字符串
NSString *a = [[NSString alloc] initWithData:datan encoding:NSUTF8StringEncoding];
#pragma mark 一般数据类型数组的存储
//创建数组
NSArray *array = @[@"大",@"王",@"让",@"我",@"来"];
//创建字符串连接 数组和字典一般在存储的时候回存为plist的类型
NSString *str = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"daiwang.plist"];
//根据路径存储
[array writeToFile:str atomically:YES];
//读取出来文件数据
NSArray *arraym = [NSArray arrayWithContentsOfFile:str];
NSLog(@"%@",arraym);
#pragma mark - - 一般数据类型字典的存储
//创建字典
NSDictionary *dictionary = @{@"品牌":@"奥迪",@"型号":@"A6",@"价格":@"60W",@"是否优惠":@"否"};
//创建路径
NSString *str = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"dic.plist"];
//根据路径存储
[dictionary writeToFile:str atomically:YES];
//读取文件的数据
NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:str];
//输出
NSLog(@"%@",dic);
#warning 文件管理器,对文件进行增删改查移动赋值,创建文件夹等操作
#pragma mark 创建文件管理器 单例 NSFileManager
//创建文件管理器
NSFileManager *fileMansger = [NSFileManager defaultManager];
//创建字符创对象
NSString *str = @"增删改查我都行,不过我只能操作文件不能干里面的东西";
//转换数据类型
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
//获取并且拼接路径信息
NSString *filepat = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"fileOne.txt"];
//使用文件管理器存储数据
[fileMansger createFileAtPath:filepat contents:data attributes:nil];
// 取到的是他的文件属性值
NSDictionary *dictionary = [fileMansger attributesOfItemAtPath:filepat error:nil];
// 取值,这里取到的返回值是字典,需要用字典接收
NSData *data0 = [fileMansger contentsAtPath:filepat];
//转码输出
NSLog(@"%@",[[NSString alloc] initWithData:data0 encoding:NSUTF8StringEncoding]);
//创建文件路径
NSString *strtwo = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"nixiao.txt"];
//对其进行文件的移动操作,移动操作需要两个值,一个是源路径,一个是目的地路径 移动过程中可以实现对文件的一些操作,修改名称和后缀。
[fileMansger moveItemAtPath:filepat toPath:strtwo error:nil];
//文件的拷贝,同样需要两个值,一个是源路径,一个是目的地路径 拷贝会保留原文件,同样拷贝过程可以对新创建的文件操作该名称和后缀的操作
[fileMansger copyItemAtPath:strtwo toPath:filepat error:nil];
//判断比较两个文件是否相同,这里需要两个值,两个要比较文件的路径,这里比较的是内容
BOOL pa = [fileMansger contentsEqualAtPath:filepat andPath:strtwo];
NSLog(@"%@",pa ? @"一样" : @"不");
// 创建新路径
NSString *stli = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"ninhao.jpg"];
//查询是否存在这个文件
BOOL pag = [fileMansger fileExistsAtPath:strtwo];
NSLog(@"%d",pag);
//删除文件的操作
[fileMansger removeItemAtPath:strtwo error:nil];
[fileMansger removeItemAtPath:filepat error:nil];
//创建文件夹,这里创建的是包含子文件的文件夹
NSString *string = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"bs/bj"];
//创建文件夹操作,里面的布尔值是指的是否创建子文件
[fileMansger createDirectoryAtPath:string withIntermediateDirectories:YES attributes:nil error:nil];
#warning 文件内容的读写操作
//创建一个字符串的对象
NSString *str = @"1234567890zxcvbnmlkj";
//创建路径
NSString *name = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"bjs.txt"];
//转换为数据类型
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
//一般的方法存储
[data writeToFile:name atomically:YES];
//创建文件的接收器
NSFileHandle *fileHandel = [NSFileHandle fileHandleForReadingAtPath:name];
//获取文件内容的五个字符,从下标0开始
NSData *dataTxt = [fileHandel readDataOfLength:5];
//输出
NSLog(@"%@",[[NSString alloc] initWithData:dataTxt encoding:NSUTF8StringEncoding]);
//获取上个下标后的10个字符
NSData *datat = [fileHandel readDataOfLength:10];
//输出
NSLog(@"%@",[[NSString alloc] initWithData:datat encoding:NSUTF8StringEncoding]);
//修改下标值
[fileHandel seekToFileOffset:0];
//获取10个字符
NSData *sta = [fileHandel readDataOfLength:10];
NSLog(@"%@",[[NSString alloc] initWithData:sta encoding:NSUTF8StringEncoding]);
NSInteger a = [fileHandel seekToEndOfFile];
NSLog(@"%ld",a);
//获取当前下标以后的所有值
NSData *sata = [fileHandel readDataToEndOfFile];
NSLog(@"%@",[[NSString alloc] initWithData:sata encoding:NSUTF8StringEncoding]);
//关闭读取
[fileHandel closeFile];
#warning 写入数据
//创建写入的接收器
NSFileHandle *wrapper = [NSFileHandle fileHandleForWritingAtPath:name ];
//创建数据转换为数据类型
NSData *datwr = [@"beijing" dataUsingEncoding:NSUTF8StringEncoding];
//添加进去根据下标添加
[wrapper writeData:datwr];
//创建下标值
[wrapper truncateFileAtOffset:40];
//关闭写入
[wrapper closeFile];
#warning 复杂对象的存取
//创建类
Person *p1 = [[Person alloc] init];
p1.name = @"beijing";
p1.age = 10;
//将类对象转换为数据类型,这里别忘了在类里面实现协议方法,否则会崩溃
NSData *datap1 = [NSKeyedArchiver archivedDataWithRootObject:p1];
//创建存储路径
NSString *str = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"person"];
//存储数据
[datap1 writeToFile:str atomically:YES];
//读取数据,这里记得实现协议方法 否则崩溃
Person *p2 = [NSKeyedUnarchiver unarchiveObjectWithFile:str];
NSLog(@"%@,%ld",p2.name,p2.age);
p2.name = @"shanghai";
p2.age = 19;
#warning 复杂对象工具类的使用 可以存储多个
//创建可变的数据类
NSMutableData *data = [[NSMutableData alloc] init];
//创建存储的工具类
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
//赋值唯一的key
[archiver encodeObject:p1 forKey:@"p1"];
[archiver encodeObject:p2 forKey:@"p2"];
//关闭存储
[archiver finishEncoding];
//创建读取的工具类
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
//根据唯一的key值取值
Person *p3 = [unarchiver decodeObjectForKey:@"p1"];
Person *p4 = [unarchiver decodeObjectForKey:@"p2"];
//关闭读取的工具类
[unarchiver finishDecoding];
NSLog(@"%@,%ld",p4.name,p4.age);