iOS进阶学习-数据处理之文件读写

一、沙盒机制

  1、什么是沙盒?

  • 每一个iOS应用程序都会为自己创建一个文件系统目录(文件夹),这个独立、封闭、安全的空间,叫做沙盒。

  2、沙盒机制(SandBox)

  • 沙盒是一种安全体系。
  • 它规定了应用程序只能在为该应用程序创建的文件夹(沙盒)内访问文件,不可以访问其它沙盒内的内容(iOS8之后已经部分开放访问)。
  • 所有的非代码文件都保存在这个地方,比如图片、声音、属性列表(plist)、sqlite数据库和文本文件等。

  3、沙盒机制的特点:

  • 每个应用程序的活动范围都限定在自己的沙盒里。
  • 不能随意跨越自己的沙盒去访问别的应用程序沙盒中的内容。
  • 应用程序向外请求或接收数据都需要经过权限认证。

  4、查找某个应用程序的沙盒有两种方式

  • 第一种:
  • 点击[前往]->同时按住Alt键->选中[资源库]->选中Developer文件夹->CoreSimulator->Devices->59DB5213FA4C4DACB3671326E0201C01->data->Containers->Data->Application->01EA9151E7BC4A19A39D38D61D4356A0
  • 红色字体的路径表示设备(模拟器)的路径
  • 蓝色字体的路径表示应用程序沙盒的路径
  • 代码实现(举例:获取Documents和Caches目录路径):
    // 地址是一个字符串
    // 第一个参数是:枚举值,枚举你具体要查找的文件夹(要进入哪个文件夹直接修改其枚举值即可)
    // NSDocumentDirectory:进去Document文件夹
    // 第二个参数:NSUserDomainMask表示用户的主目录
    // 第三个参数:一般设置为YES表示展示完整的路径
    // NSSearchPathForDirectoriesInDomains 查找沙盒路径的,返回值是一个数组,这个数组里边只有一个元素,这个元素就是路径,直接使用下标取出即可
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSLog(@"documentPath = %@", documentPath);

    NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSLog(@"cachesPath = %@", cachesPath);
  • 第二种:
  • 应用程序的沙盒目录下会有三个文件夹Documents、Library(下面有Caches和Preferences目录)、tmp。
  • Documents:存储永远不会被删除的文件,会被iTunes同步,会备份到电脑上,如果需要可以从电脑中取出(在这个文件夹中不能存储过大的文件:如视频,音频,图片)【在程序退出的时候不会被删除,但是会被同步】。
  • Library:
  • Caches(缓存):这个文件夹的作用主要是用来缓存一些像视频、音频、图片这样的内容(SDWebImage缓存的图片就存在这个文件夹中)【在程序退出的时候不会被删除,也不会被同步】。
  • Preferences(偏好设置):保存应用程序的偏好设置,iTunes会自动备份此目录,这个目录中的内容会使用NSUserDefaults去取。
  • tmp:临时文件夹用来存取临时数据,临时数据是说删除就删除,在应用程序重启的时候都会被删除掉,不会被备份,iTunes也不会同步该目录。
  • 代码实现(获取Documents和Library目录路径):
    // 第一步:找到主目录文件夹
    NSString *homePath = NSHomeDirectory();
    NSLog(@"homePath = %@", homePath);

    // 第二步:然后拼接自己想进入的路径
    NSString *documentPathTwo = [homePath stringByAppendingPathComponent:@"Documents"];
    NSLog(@"documentPathTwo = %@", documentPathTwo);

    NSString *libraryPath = [homePath stringByAppendingPathComponent:@"Library"];
    NSLog(@"libraryPath = %@", libraryPath);
  • tmp文件查找方式:
    NSString *temPath = NSTemporaryDirectory();
    NSLog(@"tmp = %@", temPath);

二、简单对象的写入与读取

  1、iOS中提供4种简单对象类型可以直接进行文件存取:NSString(字符串)、NSArray(数组)、NSDictionary(字典)、NSData(数据)。包括他们的子类。

  2、简单对象的写入/读取:

  • 代码示例(字符串):
    // 1.需要知道这个对象存在哪里,所以需要一个文件夹的路径
    // 找到Documents文件夹路径
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    // 2.创建要存储的内容:字符串
    NSString *str = @"AJAR";
    // 3.需要知道字符串最终存储的地方,所以需要创建一个路径去存储字符串
    NSString *strPath = [documentsPath stringByAppendingPathComponent:@"text.txt"];

    // 4.将字符串写入文件
    // 第一个参数:写入的文件的一个路径
    // 第二个参数:编码方式
    // 第三个参数:错误信息
    [str writeToFile:strPath atomically:YES encoding:NSUTF8StringEncoding error:nil];

#pragma mark - 将NSString文件夹存储的内容取出来
    // 将字符串取出,使用stringWithContentsOfFile这个方法将其取出
    // 第一个参数:字符串存储的路径
    // 第二个参数:编码方式
    // 第三个参数:错误信息
    NSString *newStr = [NSString stringWithContentsOfFile:strPath encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"newStr = %@", newStr);
  • 成功写入沙盒的文件:
  • 代码示例(图片):
    // 创建图片对象
    UIImage *image = [UIImage imageNamed:@"v_red_heart_selected@3x"];
    // 将image类型的对象转换成NSData类型的数据进行存储
    // 使用UIImageJPEGRepresentation将图片转换成NSData类型的
    // 第一个参数:要转换的image对象
    // 第二个参数:表示图片压缩的值compressionQuality
    // iPhone中将大于2M的图片,会自动旋转90度压缩处理,所以最终会将图片保存成jpeg格式的
    NSData *imageData = UIImageJPEGRepresentation(image, 1);
    // 找到路径进行存储
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    // 最终路径
    NSString *imagePath = [documentPath stringByAppendingString:@"/123.jpeg"];
    [imageData writeToFile:imagePath atomically:YES];

    NSLog(@"image = %@", imagePath);
    // 读取NSData类型的数据
    // 需求:将NSData类型的数据转换成UIImage并显示在ImageView上
    NSData *newData = [NSData dataWithContentsOfFile:imagePath];
    UIImage *showImage = [[UIImage alloc] initWithData:newData];
    UIImageView *myImageView = [[UIImageView alloc] initWithImage:showImage];
    [self.view addSubview:myImageView];
  • 成功写入沙盒的图片:
  • 模拟器运行结果:

三、复杂对象的写入与读取

  1、复杂对象是指在Foundation框架内不存在的数据类,如自定义Person类无法再程序内通过writeToFile:这个方法写入到文件内。

  2、归档与反归档(解档)

  • 归档就是通过将复杂对象(自定义Person类型的对象)转换为NSData类型对象,即为复杂对象的本地化,这个对象必须遵守NSCoding协议,并实现协议中的两个方法。
  • 复杂对象->归档->NSData->writeToFile。
  • 反归档就是将NSData转换为复杂对象。
  • 读取文件->NSData->反归档->复杂对象。
  • 代码示例:
@interface Person : NSObject<NSCoding>
/// 姓名
@property (nonatomic, copy) NSString *name;
/// 性别
@property (nonatomic, copy) NSString *gender;
/// 年龄
@property (nonatomic, assign) NSInteger age;

@end

@implementation Person
// 归档
// 将所有的属性进行归档
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.gender forKey:@"gender"];
    [aCoder encodeInteger:self.age forKey:@"age"];
}
// 反归档
// 将所有属性进行反归档
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.gender = [aDecoder decodeObjectForKey:@"gender"];
        self.age = [aDecoder decodeIntegerForKey:@"age"];

    }
    return self;
}

@end
    // 1.找寻Documents文件夹的目录
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    // 2.创建Person对象
    Person *person = [[Person alloc] init];
    person.name = @"MBBoy";
    person.gender = @"man";
    person.age = 25;
    // 3.把这个复杂对象归档
    // 3.1创建NSMutableData对象,用于初始化归档工具
    NSMutableData *personData = [NSMutableData data];
    // 3.2创建归档工具
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:personData];
    // 3.3对要归档的person对象进行归档
    [archiver encodeObject:person forKey:@"person"];
    // 3.4结束归档
    [archiver finishEncoding];

    // 4.将归档的内容存到本地
    NSString *dataPath = [documentPath stringByAppendingPathComponent:@"person.plist"];
    [personData writeToFile:dataPath atomically:YES];
    NSLog(@"%@", dataPath);
#pragma mark - 反归档
    // 1.将要反归档的数据找出
    NSData *resultData = [NSData dataWithContentsOfFile:dataPath];
    // 2.创建解档工具
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:resultData];
    // 3.对perosn对象进行解档
    Person *newPerson = [unarchiver decodeObjectForKey:@"person"];
    // 4.结束解档
    [unarchiver finishDecoding];
    NSLog(@"%@",newPerson.name);
    
时间: 2024-10-15 06:44:43

iOS进阶学习-数据处理之文件读写的相关文章

转载-Python学习笔记之文件读写

Python 文件读写 Python内置了读写文件的函数,用法和C是兼容的.本节介绍内容大致有:文件的打开/关闭.文件对象.文件的读写等. 本章节仅示例介绍 TXT 类型文档的读写,也就是最基础的文件读写,也需要注意编码问题:其他文件的读写及编码相关详见专题的博文. open()   close()     with open(...) as ... 看以下示例就能了解 Python 的 open() 及 close() 函数.这边调用 read()方法可以一次读取文件的全部内容,Python把

【iOS】线程安全的文件读写

前段时间看了一遍GCD(Grand Central Dispatch)多线程,GCD是苹果为多核开发提供的解决方案 多线程最常见的问题就是读写,比如数据库读写,文件读写,读取是共享的,写是互斥,允许多个线程进行读操作,当写文件时,阻止队列中所有其他的线程进入,直到文件写完成 本文利用GCD提供的相关API封装(主要有dispatch_barrier_async,dispatch_async,dispatch_queue_create)一个线程安全的文件读写类FileManager 注:这里使用的

UI进阶 数据处理之文件读写

一.沙盒机制(SandBox) 什么是沙盒:每个iOS应用程序都会为自己创建一个文件系统目录(文件夹),这个独立.封闭.安全的空间,叫做沙盒.(1)独立:每个应用程序都有自己的沙盒,这个沙盒文件只能自己使用(2)封闭:应用程序一般只能使用自己的沙盒(了解:在iOS8.0之后可以访问跨应用之间沙盒的部分文件)(3)安全:每个沙盒的内容,如果进行修改必须进行授权 沙盒是一种安全体系,它规定了应用程序只能在为该应用程序创建的文件夹(沙盒)内访问文件,不可以访问其他沙盒内的内容(iOS8.0已经部分开放

数据处理之文件读写

一.沙盒机制(SandBox) 什么是沙盒:每个iOS应用程序都会为自己创建一个文件系统目录(文件夹),这个独立.封闭.安全的空间,叫做沙盒.(1)独立:每个应用程序都有自己的沙盒,这个沙盒文件只能自己使用(2)封闭:应用程序一般只能使用自己的沙盒(了解:在iOS8.0之后可以访问跨应用之间沙盒的部分文件)(3)安全:每个沙盒的内容,如果进行修改必须进行授权 沙盒是一种安全体系,它规定了应用程序只能在为该应用程序创建的文件夹(沙盒)内访问文件,不可以访问其他沙盒内的内容(iOS8.0已经部分开放

iOS进阶学习-网络之数据解析

一.解析的基本概念 所谓“解析”:从事先规定好的格式中提取数据. 解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照格式获取数据. iOS开发常见的解析:XML解析.JSON解析. 二.XML数据结构 XML:Extensible Markup language(可扩展标记语言),主流数据格式之一,可以用来存储和传输数据. XML数据格式的功能:数据交换,内容管理,用作配置文件. XML数据结构的语法:1)声明:2)节点使用一堆标签表示:3)根节点是起始节点,只有一个,节点

iOS进阶学习-网络之数据安全

一.数据安全 1.术语: 密钥:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数.密钥分为对称密钥与非对称密钥(也可以根据用途来分为加密密钥和解密密钥). 明文:没有进行加密,能够直接代表原文含义的信息. 密文:经过加密处理处理之后,隐藏原文含义的信息. 加密:将明文转换成密文的实施过程. 解密:将密文转换成明文的实施过程. 2.数据安全 数据安全:是一种主动的包含措施,数据本身的安全必须基于可靠的加密算法与安全体系,主要是有对称算法与公开密钥密码体系两种(非对称算法),

iOS进阶学习-地图

一.地图的简介 在移动互联网时代,移动app能解决用户的很多生活琐事,比如: 导航:去任意陌生的地方. 周边:找餐馆.找酒店.找银行.找电影院. 手机软件:微信摇一摇.QQ附近的人.微博.支付宝等. 在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入这两大功能,必须基于两个框架进行开发: Map Kit :用于地图展示. Core Location :用于地理定位. 二.地图定位(CoreLocation框架,地理编码与反地理编码) 1.CoreLocation框架的使用 导入头文件

python基础教程学习笔记---(6)文件读写

1.open函数语法: python通过open函数打开文件,建立程序与文件之间的连接. open函数语法:open(filename[,mode[,buffering]]) 其中filename是指要进行操作的文件名称,由文件名称和路径组成,需要加引号. mode为操作模式参数,包括读.写.追加等. buffering是缓冲参数,控制着文件的缓冲.当buffering=0或者False时,I/O就是无缓冲的,所有的读写操作都是直接针对硬盘的,如果是1或者True,I/O就是有缓冲的,pytho

iOS进阶学习-CocoaPods的安装与使用

一.CocoaPods的安装 1.简介: CocoaPods是一个用来帮助我们管理第三方依赖库的工具. 在开发iOS应用时,会经常使用第三方类库,比如SDWebImage.AFNetworking等等,手动的下载与添加类库非常麻烦,通过CocoaPods可以便捷的下载与管理第三方类库. 使用CocoaPods的目的是让我们能自动化的.集中的.直观的管理第三方开源库. 官方链接:https://cocoapods.org 2.安装步骤 第一步:打开终端,查看自己电脑的ruby环境:gem sour