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:];
NSLog(@"documentPath = %@", documentPath);
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:];
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:];
// 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, );
// 找到路径进行存储
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:];
// 最终路径
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:];
// 2.创建Person对象
Person *person = [[Person alloc] init];
person.name = @"MBBoy";
person.gender = @"man";
person.age = ;
// 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);
iOS进阶学习-数据处理之文件读写的更多相关文章
- Java进阶学习:将文件上传到七牛云中
Java进阶学习:将文件上传到七牛云中 通过本文,我们将讲述如何利用七牛云官方SDK,将我们的本地文件传输到其存储空间中去. JavaSDK:https://developer.qiniu.com/k ...
- 【iOS】线程安全的文件读写
前段时间看了一遍GCD(Grand Central Dispatch)多线程,GCD是苹果为多核开发提供的解决方案 多线程最常见的问题就是读写,比如数据库读写,文件读写,读取是共享的,写是互斥,允许多 ...
- 转载-Python学习笔记之文件读写
Python 文件读写 Python内置了读写文件的函数,用法和C是兼容的.本节介绍内容大致有:文件的打开/关闭.文件对象.文件的读写等. 本章节仅示例介绍 TXT 类型文档的读写,也就是最基础的文件 ...
- 【学习】python文件读写,用with open as的好处,非常好【转载】
原文链接:http://www.cnblogs.com/ymjyqsx/p/6554817.html 备注:博主还有很多值得学习的笔记,遇到问题可以拜读,非常感谢博主的总结 读写文件是最常见的IO操作 ...
- 【java学习笔记】文件读写(IO流)
1.字节流 FileInputStream.FileOutputStream ①FileInputStream import java.io.FileInputStream; public class ...
- iOS学习35数据处理之文件读写
1. 沙盒机制 1> 沙盒概述 每一个iOS应用程序都会为自己创建一个文件系统目录(文件夹), 这个独立.封闭.安全的空间,叫做沙盒 注:① 每一个应用程序都会拥有一个应用程序沙盒 ② 应用程序 ...
- UI进阶 数据处理之文件读写
目录: 1-------沙盒机制(SandBox) 2-------简单对象的读写(I/O)操作 3-------复杂对象的读写(I/O)操作 一.沙盒机制(SandBox) 什么是沙盒:每个iOS应 ...
- iOS进阶学习-CoreData
一.CoreData数据库框架的优势 1.CoreData数据持久化框架是Cocoa API的一部分,首次在iOS5版本的系统中出现,它允许按照实体-属性-值模型组织数据,并以XML.二进制文件或者S ...
- iOS进阶学习-数据库
一.数据库管理系统 1.SQL语言概述:SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言. 2.常见 ...
随机推荐
- VC与JavaScript交互(三) --- CWebPage类调用javascript函数(给js函数传参,并取得返回值)
①需要一个别人写好的类CWebPage,将其对于的两个文件WebPage.h和WebPage.cpp添加到工程中. ②添加WebBrowser控件,在视图/对话框类的头文件中#include &quo ...
- MFC六大核心机制之一:MFC程序的初始化
很多做软件开发的人都有一种对事情刨根问底的精神,例如我们一直在用的MFC,很方便,不用学太多原理性的知识就可以做出各种窗口程序,但喜欢钻研的朋友肯定想知道,到底微软帮我们做了些什么,让我们在它的框架下 ...
- ubuntu下,apt的参数使用,很实用呦
ubuntu下apt-get 命令参数 常用的APT命令参数 apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版 ...
- 在阿里云 CentOS 服务器(ECS)上搭建 nginx + mysql + php-fpm 环境
阿里云的云服务器(ECS)可以选择多种操作系统,打算用它运行 Drupal或者 WordPress ,你最好选择 Linux 系统,这篇文章的演示是基于阿里云的 CentOS 操作系统的服务器.我们在 ...
- Mysql 复制工具(percona-toolkit)
Mysql 复制工具 1.percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检 ...
- winform之回车执行某个按钮 以及Esc执行某个按钮
在winform中,我们在登陆的时候,需要点击回车键,就执行登陆,点击Esc键就执行取消,那么最方便的方法就是利用AcceptButton和CancelButton这两个属性(它属于窗体属性). 如图 ...
- c#使用DocX添加多级标题
博客转移到 http://jacean.github.io/ 继续分享编程经验 先上效果.可以生成多级标题,但是不能生成1,1.1,1.2这样的自动序列, 只是这样的效果. 实现方法是给Paragra ...
- C# 获取web.config配置文件内容
1.web.config提供对客户端应用程序配置文件的访问. 其有两个属性1.ConnectionStrings 获取当前应用程序默认配置的 ConnectionStringsSection 数据. ...
- mariadb数据库备份学习笔记
备份类型: 完全备份 部分备份:仅备份其中的一张表或多张表 增量备份:仅备份从上次完全备份或增量备份之后变化的数据部分 热备份:在线备份,读写操作不受影响 温备份:在线备份,读操作可继续进行,但写操作 ...
- zabbix2.4 安装配置
首先从www.zabbix.com下载rpm包: 接下来我要配置一台zabbix server,自己监控自己即使服务端又是客户端,zabbix web gui和zabbix数据库都放在同一台主机上,除 ...