UI一揽子计划 18 (沙盒机制、简单对象写入文件、NSFileMange、复杂对象写入文件)

原创 2015年09月18日 10:55:50
1. 沙盒机制
数据持久化的原因及本质: 存储在内存中的数据,程序关闭,内存释放,数据丢失,这种数据是临时的.数据持久化是将数据保存成文件,存储到程序的沙盒中.
每个应用程序都有独立的沙盒,就是一个文件夹,名字是随机分配的.每次打开的文件夹路径都不一样.



// 打印沙盒中文件夹的路径
- (
void)path
{
   // 每运行一次 相当于从新安装一次  重新安装就从新分配一个沙盒的路径 所以每次运行 路径都不一样
   
   
// NSDocumentationDirectory 要打印的文件夹地址
   
// NSUserDomainMask 搜索的范围
       
/*
        NSUserDomainMask = 1,       // user's home directory
用户目录中
        NSLocalDomainMask = 2,      // local to the current machine ---
当前机器中
        NSNetworkDomainMask = 4,    // publically available location in the local area network ---
网络课件的主机中
        NSSystemDomainMask = 8,     // provided by Apple, unmodifiable (/System)---
系统目录 不可修改
        NSAllDomainsMask = 0x0ffff  // all domains:
所有的
        */

   
// 返回值是数组
       
/*
         lastobject   firstObject   [0]  
访问该数组都行
         */
1. document 路径
        /*
        
该文件夹 一般存储用户的一些数据
         */

   
   
   
  
NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
   
NSString *document = [array firstObject];
   
NSLog(@"%@", document);
   
2.缓存文件夹路径
    // 该文件夹 一般存储缓存文件
   
   
NSArray *array1 = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
   
NSString *cache = [array1 lastObject];
   
NSLog(@"%@", cache);
   
3.tmp文件夹路径
    // 该文件夹 一般存储tmp文件
    NSString *tmp = NSTemporaryDirectory();
    NSLog(@"%@", tmp);
4.打印沙盒的主目录路径
   
   
NSString *home = NSHomeDirectory();
   
NSLog(@"%@", home);
}
2. 简单对象写入文件
// 简单对象 写入文件
/**
 *  1.
拼接要写入的路径 (要注意的: 路径一定要拼对)
    2.
调用写入方法
 
 
    3.
注意: 如果写入简单对象字典或者数组 那么数组字典中存储的数据 必须是简单对象 无法写入复杂对象
 */

- (
void)writeFile
{
   
// 简单对象(字符串  字典  数组  data...... 这些系统写好的简单对象)
   
// 写入文件的路径 <documents路径下写入一个叫 /xiaoshuo.txt 的文件>
   
NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
   
NSString *documentsPath = [array lastObject];
   
// 拼接要写入的文件的路径  // stringByAppendingPathCommponent
   
NSString *path = [NSString stringWithFormat:@"%@/xiaoshuo.txt", documentsPath];
   
NSLog(@"%@", path);

   
NSString *string = @"第一章,在一个夜黑风高的早上,我漫步在... ...";
   
// 写入的方法
   
// atomically 如果yes 在写入的过程中 如果出现程序崩溃 就不应写写入
    [string
writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
   
   
   
// 写入一个数组
   
// 必须给后缀 默认是txt
   
NSString *path1 = [documentsPath stringByAppendingPathComponent:@"array.plist"];
   
NSArray *array1 = @[@"1",@"2",@"3",@"4",@"5"];
    [array1
writeToFile:path1 atomically:YES];
   
   
// 写入一个字典
   
NSString *dicPath = [documentsPath stringByAppendingPathComponent:@"dic.txt"];
   
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"A",@"a",@"B",@"b",@"C",@"c",@"D",@"d", nil];
    [dic
writeToFile:dicPath atomically:YES];
   
   
   
// 写入一个data
   
// data 的后缀名是 .da
   
NSString *dataPath = [documentsPath stringByAppendingPathComponent:@"data.da"];
   
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    [data
writeToFile:dataPath atomically:YES];
   
 
   
   
// 复杂对象(自定义的类创建的对象 Person,Students)
}
// 读取写入的文件
- (
void)readingFile
{
   
// 读字符串
   
// 获取路径
   
NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
   
NSString *documentsPath = [array lastObject];
   
// 拼接要写入的文件的路径  // stringByAppendingPathCommponent
   
NSString *path = [NSString stringWithFormat:@"%@/xiaoshuo.txt", documentsPath];
   
NSString *string = [[NSString alloc]initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
   
NSLog(@"%@", string);
   
   
// 读取数组
   
NSString *path1 = [documentsPath stringByAppendingPathComponent:@"array.plist"];
   
NSArray *array2 = [[NSArray alloc]initWithContentsOfFile:path1];
   
NSLog(@"%@", array2);
   
   
// 读取字典
   
NSString *dicPath = [documentsPath stringByAppendingPathComponent:@"dic.plist"];
   
NSDictionary *dic1 = [[NSDictionary alloc]initWithContentsOfFile:dicPath];
   
NSLog(@"%@", dic1);
   
   
   
// 读取data
   
NSString *dataPath = [documentsPath stringByAppendingPathComponent:@"data.da"];
   
NSData *data1 =[[NSData alloc]initWithContentsOfFile:dataPath];
   
NSString *strings = [[NSString alloc]initWithData:data1 encoding:NSUTF8StringEncoding];
    NSLog(@"%@", strings);
}

3. NSFileMange

// 创建一个文件夹

- (
void)creatFile
{
   
// 需求 documents 文件夹先创建一个download文件夹
   
//NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
   
NSString *documentsPath = kDocumentsPath;
   
// 拼接路径
   
NSString *downloadPath = [documentsPath stringByAppendingPathComponent:@"Download"];
   
// 创建文件夹
       
/*
        
文件管理者这个类是个单例类  用来对文件进行操作
         */

   
NSFileManager *fileManager = [NSFileManager defaultManager];
      
/*
         withIntermediateDirectories  
如果是YES情况下 要创建的话 存在的话 可以进行覆盖 反之文件存在的话不能对齐进行覆盖 然后创建失败
         attributes 
设置一些属性 (只读.....)
        */

   
/**
     *  /Users/lanou3g/Library/Developer/CoreSimulator/Devices/F4C0035C-BFC9-4B9A-95D1-59CE94B63E35/data/Containers/Data/Application/8A4CBE00-1C0D-4E03-893E-B389A42397DE/Documents/Download
     */

   
   
BOOL isCreatFile = [fileManager createDirectoryAtPath:downloadPath withIntermediateDirectories:YES attributes:nil error:nil];
   
NSLog(@"%d", isCreatFile);
   
   
   
}

// 移动文件夹
/*
 
移动需要俩路径
 
 */

- (
void)moveFile
{
   
// 获取原来的路径
   
NSString *oldPath = [kDocumentsPath stringByAppendingPathComponent:@"Download"];
   
   
// 获取新路径 library 下的 cache 文件夹
   
   
NSString *cachesPath = [kCachesPath stringByAppendingPathComponent:@"Download"];
   
   
// 创建 文件管理者的对象
   
   
NSFileManager *fileManager1 = [NSFileManager defaultManager];
   
   
// 移动文件夹
   
  
BOOL isMoveFile = [fileManager1 moveItemAtPath:oldPath toPath:cachesPath error:nil];
   
NSLog(@"%d", isMoveFile);
}





// 复制文件夹
- (
void)copyFile
{
   
   
   
// 获取新路径 library 下的 cache 文件夹 复制到 documents文件夹下
   
   
NSString *Path = [kCachesPath stringByAppendingPathComponent:@"Download"];
   
   
// 获取需要复制的路径
   
   
NSString *Path1 = [kDocumentsPath stringByAppendingPathComponent:@"Download"];
   
   
// 创建一个新的文件管理者对象
   
   
NSFileManager *fileManger2 = [NSFileManager defaultManager];
   
   
// 复制文件夹
   
   
BOOL isCopyFile = [fileManger2 copyItemAtPath:Path toPath:Path1 error:nil];
   
NSLog(@"%d", isCopyFile);
}

// 删除文件夹

- (
void)removeFile
{
   
// 获取要删除的文件夹的路径
   
NSString *Path1 = [kDocumentsPath stringByAppendingPathComponent:@"Download"];

   
// 创建一个文件管理者的对象
   
NSFileManager *fileManger3 = [NSFileManager defaultManager];

   
// 删除文件夹
   
BOOL isRemoveFile = [fileManger3 removeItemAtPath:Path1 error:nil];
   
NSLog(@"%d", isRemoveFile);
   
}


// 判断一个文件夹是否存在 (经常使用)
- (
void)isExistFile
{
   
// 获取要判断的路径
   
NSString *Path = [kCachesPath stringByAppendingPathComponent:@"Download"];
   
// 创建文件管理者对象
   
NSFileManager *fileManage = [NSFileManager defaultManager];
   
// 判断是否存在
   
BOOL isExistFile = [fileManage isExecutableFileAtPath:Path];
   
NSLog(@"%d", isExistFile);
}


4. 复杂对象的归档
1) 对象类中的归档
.h

/**
 * 
复杂对象进行持久化 需要遵守一个协议<NSCoding>
 
    1.
 */



@interface JJModel : NSObject<NSCoding>

@property (nonatomic,retain)NSString *name;
@property (nonatomic,assign)NSInteger age;
@property (nonatomic,retain)NSData *data;

@end
.m
@implementation JJModel
- (
void)dealloc
{
    [
_data release];
    [
_name release];
    [
super dealloc];
}

/**
 * 
对复杂对象进行持久化 叫做归档与反归档 ( 编码与解码)
 *  1. encodeWithCoder
归档方法
           
归档即 编码成可以进行持久化的格式
 *
 */


- (
void)encodeWithCoder:(NSCoder *)aCoder
{
   
// 对每一个属性都要进行重新编码
   
// 注意属性的类型
   
// 除了对象类型 其他类型都有 特殊的编码方法
   
NSLog(@"model类中的编码");
    [aCoder
encodeObject:self.name forKey:@"name"];
    [aCoder
encodeInteger:self.age forKey:@"age"];
    [aCoder
encodeObject:self.data forKey:@"data"];
}
- (
id)initWithCoder:(NSCoder *)aDecoder
{
   
self = [super init];
   
if (self) {
       
/**
         * 
解码的过程 跟编码一样 除了类型以外 也是有 特殊解码方法
           
注意: 编码的时候给的key 和解码的时候给的key 是一样的
         */

       
NSLog(@"model类中的解码");
       
self.name = [aDecoder decodeObjectForKey:@"name"];
       
self.age = [aDecoder decodeIntegerForKey:@"age"];
       
self.data = [aDecoder decodeObjectForKey:@"data"];
    }
   
return self;
}
@end


// 归档复杂对象
- (
void)archiver
{
   
// 初始化要归档的对象
   
JJModel *model = [[JJModel alloc]init];
   
// 赋值对象
    model.
name = @"JJ";
    model.
age = 60;
   
// 比如搞一个图片作为data
   
UIImage *image = [UIImage imageNamed:@"123"];
    model.
data = UIImagePNGRepresentation(image);
   
   
   
// 创建一个可变的data 进行初始化归档对象
   
NSMutableData *modelData = [NSMutableData data];
   
// 创建一个归档对象
   
   
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:modelData];
   
   
NSLog(@"归档前");
   
// 进行归档编码
    [archiver
encodeObject:model forKey:@"JJmodel"];
   
NSLog(@"归档后");
   
// 编码完成
    [archiver
finishEncoding];
   
   
   
// 实际上归档 相当于把编码完的对象 保存到data

  
// NSLog(@"%@", modelData);
   
   
// 把存有复杂对象的data 写入文件 持久化
   
   
/**
     *  1.
路径
     *
     *  2.
调写入的方法
     */

   
NSLog(@"%@", kDocumentsPath);
   
NSLog(@"存入文件夹");
   
NSString *modelDataPath = [kDocumentsPath stringByAppendingPathComponent:@"JJModel.da"];
    [modelData
writeToFile:modelDataPath atomically:YES];
    [archiver
release];

    [model
release];

}

// 反归档(解码的过程)
- (
void)unArchiver
{
   
// 获取刚才归档的data
   
NSString *modelDataPath = [kDocumentsPath stringByAppendingPathComponent:@"JJModel.da"];
   
NSData *data = [NSData dataWithContentsOfFile:modelDataPath];
    
NSLog(@"%@", kDocumentsPath);
   
// 创建反归档的对象
   
NSKeyedUnarchiver *unAchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
   
   
// 解码 返回一个对象
   
NSLog(@"解码前");

   
JJModel *model = [unAchiver decodeObjectForKey:@"JJmodel"];
   
NSLog(@"解码后");

   
// 反归档完成
    [unAchiver
finishDecoding];
   
// 释放对象
    [unAchiver
release];
   
   
NSLog(@"%@", model.name);
   
   
UIImage *image = [UIImage imageWithData:model.data];
   
UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
    imageView.
frame = CGRectMake(0, 0, 375, 667);
    [
self.view addSubview:imageView];
}    
   
5. 拓展,UIAlertView 三秒钟后自己消失 调用一个方法

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示"message:@"收藏成功"delegate:selfcancelButtonTitle:nilotherButtonTitles:nil, nil];
    [alert show];
    [
self performSelector:@selector(action:) withObject:alert afterDelay:0.3];
    [alert
release];

- (void)action:(UIAlertView *)alert
{
    [alert
dismissWithClickedButtonIndex:0 animated:YES];
}













Swift之沙盒与数据存储

应用沙盒结构分析 1、应用程序包:包含了所有的资源文件和可执行文件 2、Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录 3、tmp:保存...
  • u011290399
  • u011290399
  • 2015年01月14日 16:36
  • 2359

iOS进阶——沙盒及沙盒路径、简单文件的写入

iOS每个应用程序都有独立的空间作为其运行存储的地方,不同应用之间不允许互相访问其空间,在iOS8.0之后,逐步开放了部分权限。 一、获取程序沙盒主路径的方法 //沙盒的主路径 NSStrin...
  • q408896553
  • q408896553
  • 2016年03月08日 20:12
  • 1371

iOS经典讲解之获取沙盒文件路径写入和读取简单对象

#import @interface RootViewController : UIViewController@end
  • Loving_iOS
  • Loving_iOS
  • 2015年09月15日 20:40
  • 7650

UIday1801:沙盒三个文件的路径的获取、简单与复杂对象的读写、NSUserDefaults、NSFileManager

初级数据持久化(沙盒三个文件的路径的获取、简单与复杂对象的读写、NSUserDefaults、NSFileManager )...
  • tiebanshao
  • tiebanshao
  • 2015年09月17日 19:13
  • 418

iOS经典讲解之获取沙盒文件路径写入和读取简单对象

#import @interface RootViewController : UIViewController@end
  • Loving_iOS
  • Loving_iOS
  • 2015年09月15日 20:40
  • 7650

iOS经典讲解之获取沙盒文件路径写入和读取简单对象

#import "RootViewController.h"    @interface RootViewController ()    @end    实现文件:  @implementation...
  • walkerwqp
  • walkerwqp
  • 2016年11月01日 15:40
  • 231

47.ž沙盒机制(简单对象的写入)

沙盒机制1.每一个APP安装到手机上(或者模拟器上)都会自动生成3个文件夹 这三个文件夹 可以理解为这个App的沙盒2.并且 每个APP的文件夹 都是相对独立的 只能自己的应用去访问 不可以相互访问3...
  • mn704058053
  • mn704058053
  • 2015年12月10日 21:35
  • 182

笔记-ios-沙盒机制,简单写入文件

ios-沙盒机制,简单写入文件
  • xingchenjin_
  • xingchenjin_
  • 2015年09月16日 16:48
  • 85

iOS - 数据持久化 - 文件的写入(简单对象和复杂对象)

数据持久化的本质    - 数据保存成文件,存储到程序的沙盒中                                     - 在应用程序结束时,将内存中的数据以文件的形式搬到(保存到)硬...
  • u011347072
  • u011347072
  • 2015年09月17日 18:53
  • 3314

【学习ios之路:UI系列】iOS沙盒机制,文件读取,归档与反归档

1.IOS中的沙盒机制  IOS中的沙盒机制是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容。所有的非代码文件都保存在这个地方,比如图片、声音、属性列表...
  • ZFX5130
  • ZFX5130
  • 2015年02月03日 21:56
  • 1168
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UI一揽子计划 18 (沙盒机制、简单对象写入文件、NSFileMange、复杂对象写入文件)
举报原因:
原因补充:

(最多只允许输入30个字)