本地存储
IOS 沙盒
:每⼀个App都有⼀个存储空间。iOS系统为每个应⽤程序创建⾃⼰的⽬录,每个应⽤程序只能访问⾃⼰的⽬录,不能相互通。
目录结构如下所示:
- Documents: 保存应⽤运⾏时⽣成的需要持久化的数据,iTunes会⾃动备份该⽬录。苹果建议将在应⽤程序中浏览到的⽂件数据保存在该⽬录下。
- Library:
- Caches:⼀般存储的是缓存⽂件,例如图⽚视频等,此⽬录下的⽂件不会再应⽤程序退出时删除。在⼿机备份的时候,iTunes不会备份该⽬录。例如⾳频,视频等⽂件存放其中
- Preferences:保存应⽤程序的所有偏好设置iOS的Settings(设置),我们不应该直接在这创建⽂件,⽽是需要通过NSUserDefault这个类来访问应⽤程序的偏好设置。iTunes会⾃动备份该⽂件⽬录下的内容。⽐如说:是否允许访问图⽚,是否允许访问地理位置…
- tmp:临时⽂件⽬录,在程序重新运⾏的时候,和开机的时候,会清空tmp⽂件夹。
获取目录的代码
- (void)viewDidLoad {
[super viewDidLoad];
// 获取document目录
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [documentPaths objectAtIndex:0];
// 获取Cache目录
NSArray *cachePaths = NSSearchPathForDirectoriesInDomains
(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachePath = [cachePaths objectAtIndex:0];
// 获取Library目录
NSArray *libraryPaths = NSSearchPathForDirectoriesInDomains
(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryPath = [libraryPaths objectAtIndex:0];
// 获取Tmp目录
NSString *tmpPath = NSTemporaryDirectory();
_label.text = [NSString stringWithFormat:@"Document: %@\nCache: %@\nLibrary: %@\nTmp: %@", documentPath, cachePath, libraryPath, tmpPath];
}
文件操作
文件操作这里要用到NSFileManager
这个类
首先要创建fileManager对象,并且判断文件是否存在
// 判断文件是否存在
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *document = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
NSString *filePath = [document stringByAppendingPathComponent:@"test.txt"];
if ([fileManager fileExistsAtPath:filePath]) {
NSLog(@"test.txt exists");
}
BOOL isDirectory;
if ([fileManager fileExistsAtPath:filePath isDirectory:&isDirectory]) {
}
创建目录
// 创建目录
NSString *testDir = [document stringByAppendingPathComponent:@"test"];
// 存放创建失败的错误,方便后面来进行判断操作
NSError *error;
[fileManager createDirectoryAtPath:testDir withIntermediateDirectories:YES attributes:nil error:&error];
创建文件
// 创建文件
NSString *testTxt = [testDir stringByAppendingPathComponent:@"test.txt"];
NSData *data = [@"Hello world!" dataUsingEncoding:NSUTF8StringEncoding];
[fileManager createFileAtPath:testTxt contents:data attributes:nil];
删除文件
// 删除文件
[fileManager removeItemAtPath:testTxt error:nil];
文件读写
写文件
- (IBAction)write:(id)sender {
// 文件父目录
NSString *document = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
// 文件目录
NSString *filePath = [document stringByAppendingPathComponent:@"text.txt"];
// 写入的内容
NSString *contents = @"Hello world!";
// 调用writeToFile
[contents writeToFile:filePath atomically:YES
encoding:NSUTF8StringEncoding error:nil];
}
读文件
- (IBAction)read:(id)sender {
// 文件父目录
NSString *document = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
// 文件目录
NSString *filePath = [document
stringByAppendingPathComponent:@"text.txt"];
// 将文件内容读入字符串
NSString *content = [NSString stringWithContentsOfFile:filePath
encoding:NSUTF8StringEncoding error:nil];
NSLog(@"content %@", content);
}
NSUserDefaults
- NSUserDefaults⽤来存储 ⽤户设置 系统配置等⼀些⼩的数据。
- 因为数据是明⽂存储在 plist ⽂件中,不安全,即使只是修改⼀个 key 都会 load 整个⽂件,数据多加载慢(IO 内存),不适合存储⼤量数据。
- 它是单例的,也是线程安全的,是以键值对 key-value 的形式保存在沙盒中
- 存储路径为:沙盒路径的Library——>Preferences⽂件夹中
- ⽀持的数据类型有NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、
NSInteger、NSFloat等系统定义的数据类型,如果要存放其他数据类型或者⾃定义的对象
(如⾃定义的类对象),则必须将其转换成NSData存储。- 即使对象是NSArray或NSDictionary,他们存储的类型也应该是以上范围包括的
读取代码
// read
NSInteger x = [[NSUserDefaults standardUserDefaults]
integerForKey:@"x"];
NSString *name = [[NSUserDefaults standardUserDefaults]
stringForKey:@"name"];
NSDictionary *dict = [[NSUserDefaults standardUserDefaults]
objectForKey:@"button"];
data = [[NSUserDefaults standardUserDefaults] dataForKey:@"user"];
user = [NSKeyedUnarchiver unarchivedObjectOfClass:[User class]
fromData:data error:nil];
写入代码
// save
[[NSUserDefaults standardUserDefaults] setInteger:1024 forKey:@"x"];
[[NSUserDefaults standardUserDefaults] setObject:@"Tom" forKey:@"name"];
[[NSUserDefaults standardUserDefaults] setObject:@{
@"text": @"Cancel",
@"color": @"#ff0000",
} forKey:@"button"];
User *user = [[User alloc] init];
user.userId = 123;
user.nickname = @"Tom";
user.isVip = YES;
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:user requiringSecureCoding:YES error:nil];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"user"];