关于数据的归档存入文件和读取文件
2023-09-27 14:29:23 时间
需求:我们都知道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:
Person.m:
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:
ViewController.m:
//用来获得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;
//从文件中获取数据 NSMutableArray *arr = [self loadMarkersFromFilePath:[self getPath]]; NSLog(@"归档后提取的数据:\n%@",arr);
如何寻找创建在沙盒中的文件? 点击一下mac机上的前往功能菜单- 然后按下Alt键,会跳出一个资源库的一个隐藏文件- Application Support- iPhone Simulator- 6.1(看你当前运行的模拟器的版本)- Applications- 对应的文件- Documents- xxx.plist Demo源码: http://download.csdn.net/detail/s10141303/6013361
运行结果:
在处理大数据时,有可能 会碰到 超过3GB大小的文件,如果通过 记事本 或 NotePad++去打开它,会报错,读不到任何文件。
C#的FileStream类提供了最原始的字节级上的文件读写功能,但我们习惯于对字符串操作,于是StreamWriter和 StreamReader类增强了FileStream,它让我们在字符串级别上操作文件,但有的时候我们还是需要在字节级上操作文件,却又不是一个字节 一个字节的操作,通常是2个、4个或8个字节这样操作,这便有了BinaryWriter和BinaryReader类,它们可以将一个字符或数字按指定 个数字节写入,也可以一次读取指定个数字节转为字符或数字。
蓬莱仙羽 麦子学院讲师,游戏蛮牛专栏作家,CSDN博客专家,热爱游戏开发,热爱Coding!
需求:我们都知道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:
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:
//用来获得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;
//从文件中获取数据 NSMutableArray *arr = [self loadMarkersFromFilePath:[self getPath]]; NSLog(@"归档后提取的数据:\n%@",arr);
如何寻找创建在沙盒中的文件? 点击一下mac机上的前往功能菜单- 然后按下Alt键,会跳出一个资源库的一个隐藏文件- Application Support- iPhone Simulator- 6.1(看你当前运行的模拟器的版本)- Applications- 对应的文件- Documents- xxx.plist Demo源码: http://download.csdn.net/detail/s10141303/6013361
运行结果:
在处理大数据时,有可能 会碰到 超过3GB大小的文件,如果通过 记事本 或 NotePad++去打开它,会报错,读不到任何文件。
C#的FileStream类提供了最原始的字节级上的文件读写功能,但我们习惯于对字符串操作,于是StreamWriter和 StreamReader类增强了FileStream,它让我们在字符串级别上操作文件,但有的时候我们还是需要在字节级上操作文件,却又不是一个字节 一个字节的操作,通常是2个、4个或8个字节这样操作,这便有了BinaryWriter和BinaryReader类,它们可以将一个字符或数字按指定 个数字节写入,也可以一次读取指定个数字节转为字符或数字。
蓬莱仙羽 麦子学院讲师,游戏蛮牛专栏作家,CSDN博客专家,热爱游戏开发,热爱Coding!
相关文章
- 使用json读写文件中的数据
- 接口返回必须全部是字符串,满足JSON格式,不能是其他整形数据/文件的路径问题通过组合相对路径和绝对路径不免报错
- Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小demo mysql循环插入数据、生成随机数及CONCAT函数 .NET记录-获取外网IP以及判断该IP是属于网通还是电信 Guid的生成和数据修整(去除空格和小写字符)
- Flutter中富文件标签的解决方案
- 《Java程序设计》第16周周四:GUI编程及文件对话框的使用
- linux中有选择的删除目录中的文件
- 4.1.4 文件的物理结构(上下)
- Swift - .plist文件数据的读取和存储
- Go Web:数据存储(2)——CSV文件
- Java Spring文件上传,Java文件上传,Java通用文件上传
- 编程三基:cpu:算法,总线(io):一切皆文件;内存:运行空间
- 【C语言】#文件操作#有5个学生,每个学生有3门课程的成绩,从键盘输入以上数据(包括学号、姓名、3门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。
- Java学习-022-Properties 文件数据写入
- 《深入解析sas:数据处理、分析优化与商业应用》一一2.3 通过IMPORT过程读取外部文件数据
- vue3+axios:图片链接转换成二进制文件流后并提交服务器
- 百度开源上传组件webuploader 可上传多文件并带有进度条
- dart系列之:如丝滑般柔顺,操作文件和目录
- 【文件处理】——Python pandas 写入数据到excel中
- C/C++ Windows API——文件读写