知识点总结,沙盒机制和沙盒文件的操作
 
     沙盒机制,沙盒唯一的,每个程序只有一个沙盒,沙盒机制是苹果公司做的安全机制,访问需要权限,每个沙盒只能访问自己的沙盒里面的文件,不可以访问其他的沙盒,但是从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);