UI高级-沙盒机制和沙盒文件的读取增删改

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

转载于:https://my.oschina.net/rdqblogs/blog/684928

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值