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

需求:我们都知道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"

)

时间: 2024-10-22 06:22:49

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

android从资源文件中读取文件流并显示的方法_Android

本文实例讲述了android从资源文件中读取文件流并显示的方法.分享给大家供大家参考.具体如下: 在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: private void doRaw(){ InputStream is = this.getResources().openRawResource(R.raw.ziliao); try{ doRead(is); }catch(IOException e){ e.printStackTrace(

flex+java选择本地文件然后读取文件内容并导入到数据库中,怎么实现啊,求高手指点,,

问题描述 flex+java选择本地文件然后读取文件内容并导入到数据库中,怎么实现啊,求高手指点,,需要实现的功能是:选择本地文件txt或xls的,然后把文件内容导入数据库中,, 解决方案 解决方案二:问错版块了解决方案三:引用1楼p2227的回复: 问错版块了 !!!!!!那应该算哪个版块的,java+flex解决方案四:flex有个块的http://forum.csdn.net/SList/Flex/java一个大版块了,你展开再自己决定啰

c++ 读取文件-c++读取文件时怎么读取行数和列数建立动态数组

问题描述 c++读取文件时怎么读取行数和列数建立动态数组 现有一个txt文件,里面全是数字,c++读取时怎么自动判断其行数和列数,并根据行数列数建立动态数组小白求解 解决方案 行数 是通过换行字符来进行判断列数 计算两个换行符之间的字符位置来得到 通过对文件内容的按字符遍历来实现统计的功能 解决方案二: 通过换行符确定行数,通过最长一行中的字符数确定列数 解决方案三: #include <sstream>#include <string>std::string line;std::

写文件-Java读取文件然后再修改回去

问题描述 Java读取文件然后再修改回去 有一个文件存着很多对象,现在读取其中的一个对象,然后 将其修改,最终再将这个对象再保存回原文件.这个怎么实现.C语言由于可以控制读文件指针,所以可以定位指正到指定的位置,可是Java怎么修改文件指针? 解决方案 可以试试RandomAccessFile类. 解决方案二: 在Java下使用DOM来读取/修改Xml文件java 修改 读取properties文件 解决方案三: 可以试试RandomAccessFile类. 解决方案四: 可以试试RandomA

从Java的jar文件中读取数据的方法

  这篇文章主要介绍了从Java的jar文件中读取数据的方法,实例分析了java档案文件的相关操作技巧,需要的朋友可以参考下 本文实例讲述了从Java的jar文件中读取数据的方法.分享给大家供大家参考.具体如下: Java 档案 (Java Archive, JAR) 文件是基于 Java 技术的打包方案.它们允许开发人员把所有相关的内容 (.class.图片.声音和支持文件等) 打包到一个单一的文件中.JAR 文件格式支持压缩.身份验证和版本,以及许多其它特性. 从 JAR 文件中得到它所包含

解决-从linux服务器中读取文件数据

问题描述 从linux服务器中读取文件数据 现有一个需求: 在一台服务器上写日志文件,每当日志文件写到一定大小时,比如是1G,会将这个日志文件改名成另一个名字,并新建一个与原文件名相同的日志文件,再往这个新建的日志文件里写数据:要求写一个程序能实时地读取日志文件中的内容,并且不能写日志操作.重命名操作.不能修改日志文件的任何数据,保持日志文件的完整性. 首先,这个问题在windows下几乎无解,因为一个程序打开了一个文件,再要对文件重命名是不可能的:而在Linux下,可以得到完美解决.因为Lin

文件操作ofstream,open,close,ifstream,fin,按照行来读取数据, fstream,iosin iosout,fio.seekg(),文件写入和文件读写,文件拷贝和文件

 1.ofstream,open,close 写入文件 #include<iostream> #include<fstream>   using namespace std;   //通过ofstream的方式实现写入文件 open,close void main() {     ofstream fout;  //ofstream输出文件     fout.open("E:\\1.txt");//打开文件     fout << "1

从linux服务器中读取文件数据

问题描述 现有一个需求:在一台服务器上写日志文件,每当日志文件写到一定大小时,比如是1G,会将这个日志文件改名成另一个名字,并新建一个与原文件名相同的日志文件,再往这个新建的日志文件里写数据:要求写一个程序能实时地读取日志文件中的内容,并且不能写日志操作.重命名操作.不能修改日志文件的任何数据,保持日志文件的完整性.首先,这个问题在windows下几乎无解,因为一个程序打开了一个文件,再要对文件重命名是不可能的:而在Linux下,可以得到完美解决.因为Linux的文件系统有别于windows,L

从Java的jar文件中读取数据的方法_java

本文实例讲述了从Java的jar文件中读取数据的方法.分享给大家供大家参考.具体如下: Java 档案 (Java Archive, JAR) 文件是基于 Java 技术的打包方案.它们允许开发人员把所有相关的内容 (.class.图片.声音和支持文件等) 打包到一个单一的文件中.JAR 文件格式支持压缩.身份验证和版本,以及许多其它特性. 从 JAR 文件中得到它所包含的文件内容是件棘手的事情,但也不是不可以做到.这篇技巧就将告诉你如何从 JAR 文件中取得一个文件.我们会先取得这个 JAR