1.文件读写

1.1 iOS的沙盒机制

       每个应用程序都在磁盘上有一个对应的文件夹来存储该应用程序的一些信息,这个文件夹为沙盒(SandBox).每个应用程序的访问范围只能在自己的文件夹中,不允许访问其他应用程序的沙盒.

1.2 沙盒中的文件夹的作用

       a.Documents文件夹,主要用来存储一些重要的信息,比如用户资料,程序的配置文件,聊天记录等等.Documents中存储的信息会随着iTunes同步到电脑备份或者是iCould开发会同步到云端.该文件夹下不可存太大的内容,比如视频等.上传时会被拒掉.

       b.Caches主要存储一些缓存文件,比如视频缓存,音频缓存或者图片缓存等.

       c.tmp主要用于存储一些临时文件,比如做断点续传时的临时文件.

      这三个文件夹存储的内容都需要手动删除,极限情况下,磁盘空间不足的时候操作系统会清除tmp文件夹的内容.

1.3 沙盒路径获取及文件一系列操作

1. 取到沙盒的主目录

NSString * homePath = NSHomeDirectory();



2.拿到临时文件夹目录

NSString * tmpPath = NSTemporaryDirectory();



3.获得document文件夹路径

NSString * documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)  firstObject];

4.缓存文件路径

方法1
NSString * cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
方法2
NSString * cachesPath1 = [homePath stringByAppendingString:@"/Library/Caches"];
方法3 此api会自动补一个/
NSString * cachesPath3 = [homePath stringByAppendingPathComponent:@"Library/Caches"];

5.文件的一系列的操作,涉足到

指定路径下检查文件是否存在,拷贝文件,移动文件,移除文件,创建文件夹


NSFileManager * fileManager = [NSFileManager defaultManager];
NSString * filePath = [documentsPath stringByAppendingPathComponent:@"inputStringFile.txt"];
//检查某个路径下面是否存在某个文件
if ([fileManager fileExistsAtPath:filePath]) {
    NSLog(@"存在!!!");
    NSString * newFilePath = [cachesPath stringByAppendingPathComponent:@"test"];
    NSError * error = nil;
    //拷贝到caches下
    [fileManager copyItemAtPath:filePath toPath:newFilePath error:&error];
    if (error) {
        NSLog(@"%@",error);
    }
    //移动到temp下
    NSString * moveToNewPath = [tmpPath stringByAppendingPathComponent:@"tempFile"];
    [fileManager moveItemAtPath:newFilePath toPath:moveToNewPath error:nil];
    //移除
    [fileManager removeItemAtPath:moveToNewPath error:nil];
    //创建文件夹
    NSString * directionPath = [documentsPath stringByAppendingPathComponent:@"Files"];
    [fileManager createDirectoryAtPath:directionPath withIntermediateDirectories:YES attributes:nil error:nil];
}



6.文件的读和写

写入

//字符串写入磁盘
NSError * error = nil;
//把字符串写入到磁盘
[@"我是程序猿" writeToFile:[self filePath] atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (error) {
    NSLog(@"error:%@",error);
}
//数组写入磁盘
NSArray * array = @[@"我是",@"好看的",@"数组"];
[array writeToFile:[self filePath] atomically:YES];



文件写入注意事项:

系统提供的类NSString, NSArray, NSDictionary, NSData, 提供的有现成的写入到磁盘,和磁盘文件读出内容的API.但是,对于数组和字典,属于是容器类,它如果要想存入到磁盘,数组和字典存储的内容只能是以上4种类型,外加NSNumber和NSDate,如果数组中含有比如Person对象,直接是写不了磁盘的


读取

//从磁盘读出字符串
NSString * string = [NSString stringWithContentsOfFile:[self filePath] encoding:NSUTF8StringEncoding error:nil];
//读出数组
NSArray * array = [NSArray arrayWithContentsOfFile:[self filePath]];




2.应用程序包

2.1解释一下,来,互相伤害,哈哈

iOS的应用程序编译完都会被在整理成一个包(.app格式的文件),叫做应用程序包.包中典型成分可分为:可执行文件,图片素材,应用程序配置文件(plist),可视化编程的nib文件,以及国际化文件等等.包中的文件只读,不可修改

2.2 获得应用程序包的路径

//包的路径
NSString * bundlePath = [[NSBundle mainBundle] resourcePath];
//获取包中文件的路径
NSString * filePath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
//读取这个plist文件中的字典
NSDictionary * dic = [NSDictionary dictionaryWithContentsOfFile:filePath];

2.3 系统提供的一个用于快速持久化的类

存储的内容会在liblary文件夹中偏好设置文件夹生成一个Plist文件保存,通常用于保存用户的一些偏好设置信息,比如夜间模式,白天模式,大图浏览,小图浏览,非wifi情况下是否自动播放视频等等的偏好信息

NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:YES forKey:@"isFirstLaunching"];
[defaults setObject:@"张三" forKey:@"name"];

3.归档、解档

3.1为什么要用归档、解档

3.2归档、解档对程序内存和性能的影响

3.3归档、解档的使用及注意事项

3.3.1类要想归档存储.该类要接受NSCoding协议,我用Person这个类来进行展示

@interface Person : NSObject<span style="color:#FF0000;"><NSCoding></span>

@property (nonatomic, copy)NSString * name;
@property (nonatomic, assign)NSInteger age;
@property (nonatomic, copy)NSString * sex;

@end

3.3.2实现协议中两个必须实现的方法

@implementation Person
- (void)dealloc
{
    self.name = nil;
    self.sex = nil;
    [super dealloc];
}
//归档过程就是把每一个实例变量转成字节流(二进制数据)
- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.name forKey:NAME_KEY];
    [aCoder encodeObject:self.sex forKey:SEX_KEY];
    [aCoder encodeInteger:self.age forKey:AGE_KEY];
}

//解档过程就是把每一个实例变量转成的字节流(二进制数据)转成实例变量
- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];
    if (self) {
        self.name = [aDecoder decodeObjectForKey: NAME_KEY];
        self.sex = [aDecoder decodeObjectForKey: SEX_KEY];
        self.age = [aDecoder decodeIntegerForKey: AGE_KEY];
    }
    return self;
}
@end

3.3.3该类所有对象类型的实例变量也必须是接受过NSCoding协议的类的对象

比如说Person这个类中,NSString NSInteger 都接受过NSCoding协议的类