关于数据的归档存入文件和读取文件

简介: 需求:我们都知道NSArry中如果存放的是普通的字符串类型,是很容易存入到plist文件中,也很容易从文件中读取出来,那如果NSArray中存放的是自定义的Person对象呢?该如何存入文件中去呢? 下面我来简单写一个NSArray中继承了NSCoding协议的自定义Person对象,将这个array数组存入到plist文件中,并且能够实现读取文件中的数据的Demo 实现步骤: 1.创建一个SingleView的项目命名为test,然后创建一个自定义的Person对象,具有NSString *name和int age两个属性。

需求:我们都知道NSArry中如果存放的是普通的字符串类型,是很容易存入到plist文件中,也很容易从文件中读取出来,那如果NSArray中存放的是自定义的Person对象呢?该如何存入文件中去呢?

下面我来简单写一个NSArray中继承了NSCoding协议的自定义Person对象,将这个array数组存入到plist文件中,并且能够实现读取文件中的数据的Demo

实现步骤:

1.创建一个SingleView的项目命名为test,然后创建一个自定义的Person对象,具有NSString *name和int age两个属性。

Person.h:

#import <Foundation/Foundation.h>
@interface Person : NSObject<NSCopying,NSCoding>
@property(copy,nonatomic)NSString *name;
@property(assign,nonatomic) int age;
@end

Person.m:

#import "Person.h"

@implementation Person

-(id)copyWithZone:(NSZone *)zone
{
    Person  *p = [[Person alloc] init];  //拷贝函数不需要release,这里用autorelease会报错
    p.name = [self.name copy];
    p.age = self.age;
    return p;
}

//实现NSCoding协议
-(void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInt:self.age forKey:@"age"]; //这儿要根据不同的类型来写encode的类型
}
//反序列化提取成员变量
-(id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init]) {
        if (aDecoder == nil) {
            return self;
        }
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeIntForKey:@"age"]; //这儿也是,如果是int类型就写decodeIntForKey
    }
    return self;
}

-(NSString *)description
{
    return [NSString stringWithFormat:@"%@,%d",self.name,self.age];
}

@end

2.创建一个ViewController来实现数据的的保存

ViewController.h:

#import <UIKit/UIKit.h>
#import "Person.h"  
@interface DXWViewController : UIViewController
@property(nonatomic,retain)NSArray *Array;
@property(nonatomic,retain)Person *per;
@end

ViewController.m:

#import "DXWViewController.h"
#define kSaveKeyMarkerLines (@"person")
@interface DXWViewController ()

@end

@implementation DXWViewController

-(NSString *)getPath
{
    //用来获得Document地址
	NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);//注意:这里是NSDocument不是NSDocumentation,特别注意
    NSLog(@"%@",arr);
    //在地址上增加文件
    NSString *path = [arr[0] stringByAppendingPathComponent:@"Person.plist"];
    NSLog(@"%@",path);
    return path;
}

//传入可变数组和地址
//序列化数据
- (BOOL)saveMarkers:(NSMutableArray *)markers toFilePath:(NSString *)filePath
{
    BOOL f;
    NSMutableData *data = [[NSMutableData alloc] init];
    NSKeyedArchiver *vdArchiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [vdArchiver encodeObject:markers forKey:kSaveKeyMarkerLines];
    [vdArchiver finishEncoding];
    f = [data writeToFile:filePath atomically:YES];
    [vdArchiver release];
    [data release];
    return f;
}
//传入地址,返回可变数组
//反序列化数据
- (NSMutableArray *)loadMarkersFromFilePath:(NSString *)filePath {
    NSMutableArray *markers = nil;
    if (filePath == nil || [filePath length] == 0 ||
        [[NSFileManager defaultManager] fileExistsAtPath:filePath] == NO) {
        markers = [[[NSMutableArray alloc] init] autorelease];
    } else {
        NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
        NSKeyedUnarchiver *vdUnarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
        markers = [vdUnarchiver decodeObjectForKey:kSaveKeyMarkerLines];
        NSLog(@"++++%@",markers);
        [vdUnarchiver finishDecoding];
        [vdUnarchiver release];
        [data release];
    }
    return markers;
}


- (void)viewDidLoad
{
    [super viewDidLoad];
	Person *p1 = [[Person alloc] init];
    p1.name = @"dingxiaowei";
    p1.age = 22;
    Person *p2 = [[Person alloc] init];
    p2.name = @"wangning";
    p2.age = 33;
    self.Array  = [NSArray arrayWithObjects:p1,p2, nil];
    //保存到文件
    [self saveMarkers:self.Array toFilePath:[self getPath]];
    //从文件中获取数据
    NSMutableArray *arr = [self loadMarkersFromFilePath:[self getPath]];
    NSLog(@"归档后提取的数据:\n%@",arr);
}


@end


如何寻找创建在沙盒中的文件?

点击一下mac机上的前往功能菜单->然后按下Alt键,会跳出一个资源库的一个隐藏文件->Application Support->iPhone Simulator->6.1(看你当前运行的模拟器的版本)->Applications->对应的文件->Documents->xxx.plist

Demo源码:

http://download.csdn.net/detail/s10141303/6013361

运行结果:

2013-08-26 14:04:47.101 test[1442:c07]归档后提取的数据:

(

    "dingxiaowei,22",

    "wangning,33"

)


相关文章
|
7月前
|
Go
文件写入、追加、读取、复制不是问题
文件写入、追加、读取、复制不是问题
59 0
|
2月前
|
Android开发
文件的读取
本文介绍了文件读取和写入操作的基本概念,包括输入输出流的创建、数据读取和写入以及流的关闭。
39 1
|
3月前
|
存储
使用临时文件保存数据
使用临时文件保存数据
35 1
|
7月前
|
C++
C++程序对数据文件的操作与文件流
C++程序对数据文件的操作与文件流
52 0
|
7月前
|
C++ iOS开发
61对数据文件的操作与文件流
61对数据文件的操作与文件流
34 0
|
XML C# 数据格式
C#读取写入文件的三种方式
最近对文件的操作比较频繁。这里记录一下常用的几种文件读写的方式。 我这里使用窗体来做测试,例子在文末,可下载。
92 0
从文件1中读取数据,修改数据的内容,然后存入文件2中,再从文件2中把数据读取出来显示在屏幕上
从文件1中读取数据,修改数据的内容,然后存入文件2中,再从文件2中把数据读取出来显示在屏幕上
152 0
|
大数据 C#
C# 读取大文件 (可以读取3GB大小的txt文件)
原文:C# 读取大文件 (可以读取3GB大小的txt文件) 在处理大数据时,有可能 会碰到 超过3GB大小的文件,如果通过 记事本 或 NotePad++去打开它,会报错,读不到任何文件。
4253 1
|
C#
C#选择多个文件并读取多个文件数据
原文:C#选择多个文件并读取多个文件数据 版权声明:本文为博主原创文章,转载请附上链接地址。 https://blog.csdn.net/ld15102891672/article/details/80586097 ...
1535 0
|
C#
原 BinaryWriter和BinaryReader(二进制文件的读写)
原文 BinaryWriter和BinaryReader(二进制文件的读写) C#的FileStream类提供了最原始的字节级上的文件读写功能,但我们习惯于对字符串操作,于是StreamWriter和 StreamReader类增强了FileStream,它让我们在字符串级别上操作文件,但有的时候我们还是需要在字节级上操作文件,却又不是一个字节 一个字节的操作,通常是2个、4个或8个字节这样操作,这便有了BinaryWriter和BinaryReader类,它们可以将一个字符或数字按指定 个数字节写入,也可以一次读取指定个数字节转为字符或数字。
1629 0