沙盒(SandBox)包括Documents、Library及tmp,其中Library又包含Caches和Preferences,如下图所示:
1.具体的作用:
通俗地讲:Documents 就是用来给用户主动存储数据的文件文档;Library呢就是用来给程序员存储的资源, 其中,Caches是装缓存文件的,Preferences里放用户信息,用户设置等;tmp则是临时目录,用来存储下载的临时文件的.
2.获取沙盒路径:
运用到的是C语言函数.
(1)
如获取根目录:
NSLog( @"Home------%@", NSHomeDirectory());
临时目录:
NSLog(@"Temporary------%@", NSTemporaryDirectory());
(2)
常用的获取Document、以及Caches和Library的方法如下:
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSLog(@"PathArray-------------%@", [pathArray firstObject]);
参数1含义是搜索对应文件夹路径,可根据需要填入NSDocumentDirectory、 NSCachesDirectory以及NSLibraryDirectory;
参数2含义是在用户作用域下搜索;
参数3含义是:YES表示绝对路径,即可以获取到完整的路径,而NO则表示的是相对路径,即获取到的是较为不完整的路径(当打印路径时,路径前会有~修饰).
(3)
获取.app文件包的方法
NSLog(@"NSBundle---%@", [NSBundle mainBundle]);
3.简单的文件存储(Input/Output)
(1)将字符串写入本地
NSString *helloString= @[@"Hello, I/O File"];
NSString *writePath = [[pathArray firstObject] stringByAppendingPathComponent:@"hello.text"];
NSError *error = nil;
BOOL isSuccess = [helloString writeToFile:writePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (error) {
NSLog(@"fail");
} else {
NSLog(@"success");
}
读取字符串
NSString *readError = nil;
NSString *readString =[NSString stringWithContentsOfFile:writePath encoding:NSUTF8StringEncoding error:&readError];
NSLog(@"%@", readString);
(2)将数组写入本地
NSArray *array = @[@"FLL"];
NSString *arrayPath = [[pathArray firstObject] stringByAppendingPathComponent:@"name.plist"];
BOOL isArrayWriteSuccess = [array writeToFile:arrayPath atomically:YES];
if (isArrayWriteSuccess) {
NSLog(@"success");
} else {
NSLog(@"failure");
}
读取数组
NSArray *nameArray = [NSArray arrayWithContentsOfFile:arrayPath];
NSLog(@"%@", nameArray);
(3)将字典写入本地
NSDictionary *dictionary = @{@"name":@"guo"};
NSString *dicPath = [[pathArray firstObject] stringByAppendingPathComponent:@"dic.plist"];
BOOL isDicSuccess = [dictionary writeToFile:dicPath atomically:YES];
if (isArrayWriteSuccess) {
NSLog(@"成功");
} else {
NSLog(@"失败");
}
读取字典
NSDictionary *dicContent = [NSDictionary dictionaryWithContentsOfFile:dicPath];
NSLog(@"dic%@", dicContent);
(4)将Data类型写入本地
UIImage *image = [UIImage imageNamed:@"照片"];
将图片转化成二进制(UIImageJPEGRepresentation()/UIImagePNGRepresentation())
NSData *imageData = UIImageJPEGRepresentation(image, 0.1);
其中0.1为缩放比例,可不写则默认为不进行缩放
NSString *dataPath = [[pathArray firstObject] stringByAppendingPathComponent:@"imageData"];
BOOL isDataWriteSuccess = [imageData writeToFile:dataPath atomically:YES];
if (isDataWriteSuccess) {
NSLog(@"OK!");
} else {
NSLog(@"NO OK!");
}
读取Data类型
NSData *imageNewData = [NSData dataWithContentsOfFile:dataPath];
NSLog(@"image:%@", imageData);
UIImage *fileImage = [UIImage imageWithData:imageData];
4.复杂对象文件读写, 自定义类型(归档/反归档,也称序列化/反序列化)
归档:将对象存储到本地
Book *book = [Book new];
book.bookName = @"iOS从入门到放弃";
book.bookType = @"教育";
book.bookPrice = @"64";
book.bookAuthor = @"郭宝";
book.bookAddress = @"郭宝黑科技出版社";
NSString *bookPath = [[pathArray firstObject] stringByAppendingPathComponent:@"book.plist"];
BOOL isBookWriteSuccess =[NSKeyedArchiver archiveRootObject:book toFile:bookPath];
if (isBookWriteSuccess) {
NSLog(@"欧耶, 你赢了!");
} else {
NSLog(@"日了狗了!");
}
反归档:
Book *huangBook = [NSKeyedUnarchiver unarchiveObjectWithFile:bookPath];
NSLog(@"%@", huangBook.bookName);
//
// Book.h
// 17-SandBox
//
// Created by 郭宝 on 16/8/5.
// Copyright © 2016年 郭宝. All rights reserved.
//
#import <Foundation/Foundation.h>
// 1.需要归档的类, 需要签订和实现 <NSCoding> 协议
@interface Book : NSObject <NSCoding>
@property (nonatomic, copy) NSString *bookName;
@property (nonatomic, copy) NSString *bookPrice;
@property (nonatomic, copy) NSString *bookAuthor;
@property (nonatomic, copy) NSString *bookAddress;
@property (nonatomic, copy) NSString *bookType;
@end
//
// Book.m
// 17-SandBox
//
// Created by 郭宝 on 16/8/5.
// Copyright © 2016年 郭宝. All rights reserved.
//
#import "Book.h"
@implementation Book
// 取值
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
_bookName = [aDecoder decodeObjectForKey:@"bookName"];
_bookPrice = [aDecoder decodeObjectForKey:@"bookPrice"];
_bookAddress = [aDecoder decodeObjectForKey:@"bookAddress"];
_bookType = [aDecoder decodeObjectForKey:@"bookType"];
_bookAuthor = [aDecoder decodeObjectForKey:@"bookAuthor"];
}
return self;
}
// 赋值, 存储
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:_bookName forKey:@"bookName"];
[aCoder encodeObject:_bookAddress forKey:@"bookAddress"];
[aCoder encodeObject:_bookPrice forKey:@"bookPrice"];
[aCoder encodeObject:_bookType forKey:@"bookType"];
[aCoder encodeObject:_bookAuthor forKey:@"bookAuthor"];
}
接下来Finder->前往文件夹->粘贴PathArray->前往.