iOS中的 沙盒文件夹 (数据的写入和读取,归档和反归档)

AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    /**
    沙盒中文件夹:
     1.Documents : 存储长久保存的数据
     2.library:
        Caches:存放的缓存,比如:视频,音频,图片,小说等等
        Perferences:存储偏好设置,比如:应用程序是否是第一次启动
        保存用户名和密码.
     3.tmp:存储临时文件,比如:下载的zip包,解压后直接删除.
     */

   //1.获取沙盒文件路径
    NSString *homePath= NSHomeDirectory();
    NSLog(@"%@",homePath);

    //NSUserDefaults 直接操作 Preferences 文件夹
    /*
    NSUserDefaults *userdefaults = [NSUserDefaults standardUserDefaults];
    [userdefaults setBool:YES forKey:@"FirstLanch"];
    [userdefaults setObject:@"Leo" forKey:@"userName"];
    [userdefaults setObject:@"lanoulanou" forKey:@"password"];
    [userdefaults synchronize]; //立即同步
    */
    //1.需求:判断用户之前是否已经登录,如果登录则提示登录成功,否则提示输入用户名和密码,存储到本地
    //NSUserDefaults *userdefaults = [NSUserDefaults standardUserDefaults];
//    if (![userdefaults objectForKey:@"account"] || ![userdefaults objectForKey:@"password"]) {
//        //无效状体,此时需要提醒用户,输入用户名和密码
//        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"你之前没有登录" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"登录", nil];
//        //设置警示框样式
//        alertView.alertViewStyle = UIAlertViewStyleLoginAndPasswordInput;
//        [alertView show];
//        [alertView release];
//    }else{
//        //有效登录状体,提示用户,登录成功
//        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"你已经登录" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil];
//        [alert show];
//        [alert release];
//    }
    //2.应用程序包得路径
    NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
    NSLog(@"%@",bundlePath);
    return YES;
}

//点击警示框的按钮触发的方法
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    switch (buttonIndex) {
        case 1:
        {
        //获取警示框上得的输入框中的内容
            NSString *accout = [alertView textFieldAtIndex:0].text;
            NSString *password = [alertView textFieldAtIndex:1].text;
            //持久化处理
            NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
            //将用户名密码存储到沙盒中 Preferences 文件夹下
            [user setObject:accout forKey:@"account"];
            [user setObject:password forKey:@"password"];
            [user synchronize];
        }
            break;

        default:
            break;
    }
}
RootViewController.m
#import "RootViewController.h"

@interface RootViewController ()
@property (retain, nonatomic) IBOutlet UITextField *nameTextField;
@property (retain, nonatomic) IBOutlet UITextField *pswTextField;

@end

@implementation RootViewController
/**
 *文件读取支持的类型:(字符串,数组,字典,二进制数据 -- NSData)
 1.写入文件.
 writeToFile:atomically:--针对于 数组,字典,二进制数据

 writeToFile:atomically:encoding:error: --针对于字符串

 2.从文件中读取数据
 [类名 类名WithContentsOfFile:(文件路径)]; --- 针对于数组,字典,二进制数据
 [类名 类名WithContentsOfFile:encoding:error:]; --- 针对字符串

 3.VVVIP
 对于数组,字典大容器来说,想要实现文件读写,必须保证容器中的元素也必须是字符串,数组,字典,二进制数据类型之一.

 */

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (IBAction)writeBtn:(id)sender {
//    //1.字符串写入文件
//    NSError *error = nil;
//    //先读取源文件中的内容
//    NSString *oldStr = [NSString stringWithContentsOfFile:[self filePath] encoding:NSUTF8StringEncoding error:nil];
//    //将原有数据与新数据拼接一起
//
//
//
//    NSString *newStr = [oldStr stringByAppendingFormat:@"%@",self.nameTextField.text];
//    if (!newStr) {
//        newStr = self.nameTextField.text;
//    }
//   BOOL isSuccess = [newStr writeToFile:[self filePath] atomically:YES encoding:NSUTF8StringEncoding error:&error];
//    if (isSuccess) {
//        NSLog(@"写入成功");
//    }else{
//        NSLog(@"写入失败");
//    }
    //2.数组写入文件
//    NSArray *dataArr = @[self.nameTextField.text, self.pswTextField.text];
//
//
//
//    BOOL isSuccess = [dataArr writeToFile:[self filePath] atomically:YES];

    //2.字典写入文件
    NSDictionary *dic = @{@"tf1":self.nameTextField.text,@"tf2":self.pswTextField.text};
    [dic writeToFile:[self filePath] atomically:YES];

}

- (IBAction)readBtn:(id)sender {
//    //1.字符串从文件中读取
//   NSString *text = [NSString stringWithContentsOfFile:[self filePath] encoding:NSUTF8StringEncoding error:nil];
//    //2.让第二个输入框显示
//    self.pswTextField.text = text;

//    NSArray *dataArr = [NSArray arrayWithContentsOfFile:[self filePath]];
//    //第一个输入框显示第二个输入框的内容,第二个输入框显示第一个输入框的内容
//    self.nameTextField.text = [dataArr lastObject];
//    self.pswTextField.text = dataArr[0];

     //3.字典从文件中读取数据
    NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:[self filePath]];
    self.nameTextField.text = [dic objectForKey:@"tf2"];
    self.pswTextField.text = [dic objectForKey:@"tf1"];
}

//获取文件路径
- (NSString *)filePath{
    //1.获取Document(存放持久保存的数据)文件夹路径
    //参数1:查找的文件路径
    //参数2:在那个域中查找
    //参数3:是否显示详细路径
   NSString *doucumentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    //2.拼接上文件路径
    NSString *filtPath = [doucumentsPath stringByAppendingPathComponent:@"Leo.txt"];
    NSLog(@"%@",filtPath);
    return filtPath;
}

- (void)dealloc {
    [_nameTextField release];
    [_pswTextField release];
    [super dealloc];
}
@end
SecondViewController.m
#import "SecondViewController.h"
#import "Contact.h"
@interface SecondViewController ()
@property (retain, nonatomic) IBOutlet UITextField *secondNameTFd;
@property (retain, nonatomic) IBOutlet UITextField *secondPwdTFd;

@end

@implementation SecondViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
//归档按钮
- (IBAction)archiveFile:(id)sender {
    Contact *contact = [[Contact alloc] initWithName:self.secondNameTFd.text gender:self.secondPwdTFd.text age:19 phoneNumber:@"332" motto:@"不成功便成仁"];
    //1.创建归档工具对象
    NSMutableData *mData =[NSMutableData data];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mData];
    //2.开始归档
    [archiver encodeObject:contact forKey:@"Leo"];
    //3.结束归档
    [archiver finishEncoding];

    //4.内存释放
    [contact release];
    [archiver release];
    //data写入文件
    BOOL isSuccess = [mData writeToFile:[self getFilePath] atomically:YES];
}
//反归档
- (IBAction)noArchiveFile:(id)sender {
    //1.Data从本地读取数据
    NSData *data = [NSData dataWithContentsOfFile:[self getFilePath]];
    //2.创建反归档工具
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    //3.开始反归档
   Contact *contact = [unarchiver decodeObjectForKey:@"Leo"];
    //4.结束反归档
    [unarchiver finishDecoding];

    //释放
    [unarchiver release];

    //5.读取数据
    self.secondNameTFd.text = contact.phoneNumber;
    self.secondPwdTFd.text = contact.name;
}

//获取文件路径的方法
- (NSString *)getFilePath{
    //1.获取 Documents 文件夹路径
    NSString *doucumentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    //2.拼接上存储文件的路径
    NSString *filePath = [doucumentsPath stringByAppendingPathComponent:@"Leo.data"];
    NSLog(@"%@",filePath);
    return filePath;
}

- (void)dealloc {
    [_secondNameTFd release];
    [_secondPwdTFd release];
    [super dealloc];
}
@end
Contact.h

#import <Foundation/Foundation.h>

@interface Contact : NSObject<NSCoding>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *gender;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, copy) NSString *motto;
@property (nonatomic, copy) NSString *phoneNumber;

- (instancetype)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age phoneNumber:(NSString *)phoneNumber motto:(NSString *)motto;
@end

Contact.m

#import "Contact.h"

@implementation Contact
- (instancetype)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age phoneNumber:(NSString *)phoneNumber motto:(NSString *)motto{
    if (self = [super init]) {
        self.name = name;
        self.gender = gender;
        self.age = age;
        self.phoneNumber = phoneNumber;
        self.motto = motto;
    }
    return self;
}

/**
 *  当一个对象进行归档是,自动调用该方法,为该对象的实例变量进行归档操作.
 *
 *  @param aCoder <#aCoder description#>
 */
- (void)encodeWithCoder:(NSCoder *)aCoder{
    //内部,要对每一个实例变量进行归档操作
    [aCoder encodeObject:_name forKey:@"name"];
    [aCoder encodeObject:_gender forKey:@"gender"];
    [aCoder encodeObject:@(_age) forKey:@"age"];
    [aCoder encodeObject:_motto forKey:@"motto"];
    [aCoder encodeObject:_phoneNumber forKey:@"phoneNumber"];
}
//当对一个对象进行反归档操作时,自动调用该方法,为该方法的实例变量进行反归档操作
- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init]) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.gender = [aDecoder decodeObjectForKey:@"gender"];
        self.age = [[aDecoder decodeObjectForKey:@"age"] integerValue];
        self.motto = [aDecoder decodeObjectForKey:@"motto"];
        self.phoneNumber = [aDecoder decodeObjectForKey:@"phoneNumber"];
    }
    return self;
}

-(void)dealloc
{
    self.name = nil;
    self.gender = nil;
    self.phoneNumber = nil;
    self.motto = nil;
    [super dealloc];
}
@end
时间: 2024-08-02 19:18:50

iOS中的 沙盒文件夹 (数据的写入和读取,归档和反归档)的相关文章

IOS中的沙盒机制

IOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容.所有的非代码文件都保存在这个地方,比如图片.声音.属性列表和文本文件等. 1.每个应用程序都在自己的沙盒内 2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容 3.应用程序向外请求或接收数据都需要经过权限认证 查看模拟器的沙盒文件夹在Mac电脑上的存储位置,首先,这个文件夹是被隐藏的,所以要先将这些文件显示出来,打开命令行: 显示Mac隐藏文件的命令:defau

iOS沙盒文件夹及获取路劲方法

iPhone沙盒中有四个文件夹,分别是:documents.tmp.app.library. 1.Documents :用户生成的文档或数据,或者应用不能重新新创建的数据,存储在/Documents目录下,并且会被自动备份到iCloud: 2.AppName.app :应用程序的包存储在/app目录下.由于应用程序必须经过签名,所以该目录下的内容不能修改,否则程序可能无法启动: 3.tmp:临时文件存放在该目录下(应用程序再次启动时不需要的信息,应用需要写到本地存储,内部使用的临时数据,但不需要

获取沙盒文件夹路径的几个方法

1 #import "ViewController.h" 2 3 @interface ViewController () 4 5 @end 6 7 @implementation ViewController 8 9 - (void)viewDidLoad { 10 [super viewDidLoad]; 11 12 #pragma mark - 第一种打开应用程序沙盒路径的方式 13 14 // 地址是一个字符串 15 // NSSearchPathForDirectoriesI

沙盒文件夹

document: 应该将所有的应用程序数据文件写入到这个目录下, 这个目录用于存储用户数据或者其他应该定期备份的信息 APP: 应用程序包目录, 包含应用程序的本身, 由于应用程序必须经过签名, 所以在运行时不能对这个目录中的内容进行修改, 否则可能会使应用程序无法启动, library:  caches: 用于存放应用程序专用的支持文件, 保存应用程序再次启动过程中需要的信息, preferences: 包含应用程序的偏好设置文件, 不应该直接创建偏好设置文件, 而是应该使用NSUserDe

iOS真机沙盒文件查看 图片批量存储/获取/删除

转载请标注来自:http://blog.csdn.net/u014202635/article/details/46863629 1. 选Devices 2. 3. 选中第二行 4. 保存在桌面 5. 右击选中显示包内容 6. 以上环境为x-code6.3.1 //---------------------------------------------------------------------------------------------------------------------

ios中Raw文件系统常用文件夹

1.[/Applications] 常用软件的安装目录 2.[/Applications/Preferences.app/zh_CN.lproj] 软件Preferences.app的中文汉化文件存放地方(直接修改里面的*.strings文件可以修改中文翻译,注意最后要转换成UTF-8的格式) 3.[/Library/Ringtones] 系统自带的来电铃声存放目录 4.[/Library/Wallpaper] 系统墙纸的存放目录 5.[/System/Library/Audio/UISound

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

1.IOS中的沙盒机制 IOS中的沙盒机制是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容.所有的非代码文件都保存在这个地方,比如图片.声音.属性列表和文本文件等. 特点: 1.每个应用程序都在自己的沙盒内 2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容 3.应用程序向外请求或接收数据都需要经过权限认证 每个沙盒含有3个文件夹:Documents, Library 和 tmp.Library包含Caches.Preferences目录.如下图

计算沙盒下文件夹内容大小 清空沙盒 文件 目录

1 +(float)fileSizeForDir:(NSString*)path//计算文件夹下文件的总大小 2 3 { 4 5 NSFileManager *fileManager = [[NSFileManager alloc] init]; 6 7 float size =0; 8 9 NSArray* array = [fileManager contentsOfDirectoryAtPath:path error:nil]; 10 11 for(int i = 0; i<[array

iOS开发寻找沙盒路径

寻找沙盒路径方法:(网上帖子的方法不行,可以尝试第一种) 1.直接打印NSHomeDirectory() 即 NSLog(@"%@", NSHomeDirectory()); 对于NSHomeDirectory()官方的描述是: 对于mac打印出来后就会得到沙盒的路径,例如我得到的打印结果是: /Users/zzz/Library/Developer/CoreSimulator/Devices/80CA1C69-E887-4F00-8508-7A9F590204A4/data/Cont