1 使用NSFilehandle进行数据读写

1.1 问题

NSFileManager用于实现对文件的操作,而NSFileHandle是IOS提供的对文件内容(二进制数据)进行操作的类,例如数据的读写、数据追加、数据拷贝等。本案例演示使用NSFileHandle对文件数据进行基本的读写操作。

1.2 方案

首先使用NSFileManager创建一个文件,然后创建一个NSData类型的对象data,存储一个字符串数据,该数据就是需要写入文件的数据。

再使用方法fileHandleForWritingAtPath:创建一个NSFileHandle类型的写入文件对接器writeFileHandle,path参数就是写入的文件路径。

然后通过writeFileHandle将data写入NSFileManager创建好的文件,完成之后要关闭对接器。

最后实现文件的读取,从文件读取数据则使用fileHandleForReadingAtPath:方法创建读取文件对接器readFileHandle,通过readDataToEndOfFile方法读取文件数据,最后要关闭对接器。

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:写入数据

首先使用NSFileManager创建一个文件,然后创建一个NSData类型的对象data,存储一个字符串数据,该数据就是需要写入文件的数据,代码如下所示:

 
  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. //一、文件的读写
  4. NSString *filePath = @"/Users/Tarena/Desktop/file";
  5. // 前期准备,使用fileManager创建文件
  6. NSFileManager * fileManager = [NSFileManagerdefaultManager];
  7. [fileManagercreateFileAtPath:filePathcontents:nilattributes:nil];
  8. // 文件写入:NSString ->NSData
  9. NSString * words = @"1234567890";
  10. NSData * data = [words dataUsingEncoding:NSUTF8StringEncoding];
  11. }
  12. return 0;
  13. }

然后再使用方法fileHandleForWritingAtPath:创建一个NSFileHandle类型的写入文件对接器writeFileHandle,通过writeFileHandle将data写入NSFileManager创建好的文件,代码如下所示:

 
  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. //一、文件的读写
  4. NSString *filePath = @"/Users/Tarena/Desktop/file";
  5. // 前期准备,使用fileManager创建文件
  6. NSFileManager * fileManager = [NSFileManagerdefaultManager];
  7. [fileManagercreateFileAtPath:filePathcontents:nilattributes:nil];
  8. // 文件写入:NSString ->NSData
  9. NSString * words = @"1234567890";
  10. NSData * data = [words dataUsingEncoding:NSUTF8StringEncoding];
  11. //文件对接,创建写入文件对接器writingHandle
  12. NSFileHandle * writingHandle =
  13. [NSFileHandlefileHandleForWritingAtPath:filePath];
  14. //读写操作
  15. [writingHandlewriteData:data];
  16. }
  17. return 0;
  18. }

最后写入数据完成之后要记得关闭对接器,代码如下所示:

 
  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. //一、文件的读写
  4. NSString *filePath = @"/Users/Tarena/Desktop/file";
  5. // 前期准备,使用fileManager创建文件
  6. NSFileManager * fileManager = [NSFileManagerdefaultManager];
  7. [fileManagercreateFileAtPath:filePathcontents:nilattributes:nil];
  8. // 文件写入:NSString ->NSData
  9. NSString * words = @"1234567890";
  10. NSData * data = [words dataUsingEncoding:NSUTF8StringEncoding];
  11. //文件对接,创建写入文件对接器writingHandle
  12. NSFileHandle * writingHandle =
  13. [NSFileHandlefileHandleForWritingAtPath:filePath];
  14. //读写操作
  15. [writingHandlewriteData:data];
  16. //关闭对接
  17. [writingHandlecloseFile];
  18. }
  19. return 0;
  20. }

运行程序桌面上增加一个名为file的文件,存储的数据就是“1234567890”字符串,如图-1所示:

图-1

步骤二:读取数据

首先从文件读取数据则使用fileHandleForReadingAtPath:方法创建读取文件对接器readFileHandle,代码如下所示:

  1. NSFileHandle * readingHandle =
  2. [NSFileHandlefileHandleForReadingAtPath:filePath];

然后通过readDataToEndOfFile方法读取文件数据获得data2对象,读取完成之后要关闭对接器,代码如下所示:

  1. NSData * data2 =
  2. [readingHandlereadDataToEndOfFile];
  3. [readingHandlecloseFile];

最后将data2转化成字符串输出,代码如下所示:

 
  1. NSString * wordsOut = [[NSStringalloc] initWithData:data2 encoding:NSUTF8StringEncoding];
  2. NSLog(@"%@", wordsOut);

运行程序,可以看见控制台将字符串“1234567890”输出,如图-2所示:

图-2

1.4 完整代码

本案例中,main.m文件中的完整代码如下所示:

 
  1. #import<Foundation/Foundation.h>
  2. int main(intargc, const char * argv[]) {
  3. @autoreleasepool {
  4. //一、文件的读写
  5. NSString *filePath = @"/Users/Tarena/Desktop/file";
  6. // 文件写入:NSString ->NSData
  7. NSString * words = @"1234567890";
  8. NSData * data = [words dataUsingEncoding:NSUTF8StringEncoding];
  9. // 前期准备,使用fileManager创建文件
  10. NSFileManager * fileManager = [NSFileManagerdefaultManager];
  11. [fileManagercreateFileAtPath:filePathcontents:nilattributes:nil];
  12. //文件对接,创建写入文件对接器writingHandle
  13. NSFileHandle * writingHandle =
  14. [NSFileHandlefileHandleForWritingAtPath:filePath];
  15. //读写操作
  16. [writingHandlewriteData:data];
  17. //关闭对接
  18. [writingHandlecloseFile];
  19. // 文件读取:文件 --(NSFileHandle)-->NSData
  20. // 文件对接,将一个 读对接器对接到文件
  21. NSFileHandle * readingHandle =
  22. [NSFileHandlefileHandleForReadingAtPath:filePath];
  23. // 读写操作,将文件内的数据读入到内存中
  24. NSData * data2 =
  25. [readingHandlereadDataToEndOfFile];
  26. //关闭对接操作结束后,对接器必须关闭
  27. [readingHandlecloseFile];
  28. // NSData ->NSString
  29. NSString * wordsOut = [[NSStringalloc] initWithData:data2 encoding:NSUTF8StringEncoding];
  30. NSLog(@"%@", wordsOut);
  31. }
  32. return 0;
  33. }

2 使用NSFilehandle进行数据追加

2.1 问题

上一个案例演示了如何使用NSFileManager进行数据的读写,NSFileManager还可以实现文件数据的拼接和追加,其实就是将需要数据添加到原文件的末尾,本案例演示如何使用NSFilehandle进行数据追加。

2.2 方案

首先使用NSFileManager在桌面创建一个名为combine.txt文件,文件内容是一个字符串“Hello world“。

然后在桌面上准备三个txt文件命名为“a.txt”、“b.txt”以及“c.txt”,三个文件分别存储三个不同字符串“123456”、“abcdefg”以及“abcdefg“,本案例实现的功能就是将这三个文件的字符串内容依次追加到combine.txt文件的数据末尾,最后 combine.txt文件存储的字符串为”Hello world123456abcdefgABCDEFG“。

要实现追加数据首先使用方法fileHandleForWritingAtPath:创建一个NSFileHandle类型的写入文件对接器writeFileHandle,写入文件路径就是combine.txt的文件路径。然后使用seekToEndOfFile方法将writeFileHandle的文件指针移至数据的末尾。

然后使用读取文件对接器readFileHandle依次从“a.txt”、“b.txt”以及“c.txt”三个文件中读取数据,通过readDataToEndOfFile方法读取文件数据获得data对象,再通过writeFileHandle将获得的data对象写入combine.txt文件。

最后在读取完成之后要关闭读写对接器。

2.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:创建和准备文件数据

首先使用NSFileManager在桌面创建一个名为combine.txt文件,文件内容是一个字符串“Hello world“,代码如下所示:

 
  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. NSString *documentPath = @"/Users/Tarena/Desktop";
  4. NSString * outputName = @"combine.txt";
  5. NSFileManager * fileManager = [NSFileManagerdefaultManager];
  6. NSString * outputFilePath = [documentPathstringByAppendingPathComponent:outputName];
  7. NSString *str = @"hello world";
  8. NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
  9. [fileManagercreateFileAtPath:outputFilePathcontents:dataattributes:nil];
  10. }
  11. return 0;
  12. }

然后在桌面上准备准备三个txt文件命名为“a.txt”、“b.txt”以及“c.txt”,三个文件分别存储三个不同字符串“123456”、“abcdefg”以及“abcdefg“,本案例实现的功能就是将这三个文件的字符串内容依次追加到combine.txt文件的数据末尾,最后 combine.txt文件存储的字符串为”Hello world123456abcdefgABCDEFG“,如图-3所示:

图-3

步骤二:追加数据

要实现追加数据首先使用方法fileHandleForWritingAtPath:创建一个NSFileHandle类型的写入文件对接器writeFileHandle,写入文件路径就是combine.txt的文件路径。然后再使用seekToEndOfFile方法将writeFileHandle的文件指针移至数据的末尾,代码如下所示:

  1. NSFileHandle * writingHandle = [NSFileHandlefileHandleForWritingAtPath:outputFilePath];
  2. //将对接器的文件指针移至数据的末尾
  3. [writingHandleseekToEndOfFile];

然后使用读取文件对接器readFileHandle依次从“a.txt”、“b.txt”以及“c.txt”三个文件中读取数据,通过readDataToEndOfFile方法读取文件数据获得data对象,再通过writeFileHandle将获得的data对象写入combine.txt文件,读写完成之后关闭读写对接器,代码如下所示:

 
  1. NSArray * sourceNames = @[@"a.txt", @"b.txt", @"c.txt"];
  2. for (NSString * sourceFileName in sourceNames) {
  3. NSString * sourceFilePath = [documentPathstringByAppendingPathComponent:sourceFileName];
  4. NSFileHandle * readingHandle = [NSFileHandlefileHandleForReadingAtPath:sourceFilePath];
  5. //从当前节点读取到文件的末尾
  6. NSData * data = [readingHandlereadDataToEndOfFile];
  7. [writingHandlewriteData:data];
  8. [readingHandlecloseFile];
  9. }
  10. [writingHandlecloseFile];

运行程序,打开combine.txt文件,存储的字符串为”Hello world123456abcdefgABCDEFG“。

2.4 完整代码

本案例中,main.m文件中的完整代码如下所示:

 
  1. #import<Foundation/Foundation.h>
  2. int main(intargc, const char * argv[]) {
  3. @autoreleasepool {
  4. NSString *documentPath = @"/Users/Tarena/Desktop";
  5. NSString * outputName = @"combine.txt";
  6. NSFileManager * fileManager = [NSFileManagerdefaultManager];
  7. NSString * outputFilePath = [documentPathstringByAppendingPathComponent:outputName];
  8. NSString *str = @"hello world";
  9. NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
  10. [fileManagercreateFileAtPath:outputFilePathcontents:dataattributes:nil];
  11. NSFileHandle * writingHandle = [NSFileHandlefileHandleForWritingAtPath:outputFilePath];
  12. //将对接器的文件指针移至数据的末尾
  13. [writingHandleseekToEndOfFile];
  14. NSArray * sourceNames = @[@"a.txt", @"b.txt", @"c.txt"];
  15. for (NSString * sourceFileName in sourceNames) {
  16. NSString * sourceFilePath = [documentPathstringByAppendingPathComponent:sourceFileName];
  17. NSFileHandle * readingHandle = [NSFileHandlefileHandleForReadingAtPath:sourceFilePath];
  18. //从当前节点读取到文件的末尾
  19. NSData * data = [readingHandlereadDataToEndOfFile];
  20. [writingHandlewriteData:data];
  21. [readingHandlecloseFile];
  22. }
  23. [writingHandlecloseFile];
  24. }
  25. return 0;
  26. }

3 使用NSFilehandle进行数据拷贝

3.1 问题

数据拷贝其实就是将原文件的数据重新写入到一个新的路径,本案例演示如何使用NSFileHandle进行数据的拷贝,将上一个案例的combine.txt文件内容拷贝到tarena.txt文件中。

3.2 方案

首先使用读取文件对接器readFileHandle读取combine.txt文件中的数据,获取一个data对象。

然后使用NSfileManager创建一个新的文件,使用写入文件对接器writingHandle将data数据写入tarena.txt文件中。

最后要关闭读写对接器。

3.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:读取文件数据

首先使用读取文件对接器readFileHandle读取combine.txt文件中的数据,获取一个data对象,代码如下所示:

 
  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. NSString *documentPath = @"/Users/Tarena/Desktop";
  4. NSString * fileName = @"combine.txt";
  5. NSString * path = [documentPathstringByAppendingPathComponent:fileName];
  6. //读取文件数据
  7. NSFileHandle *readingHandle = [NSFileHandlefileHandleForReadingAtPath:path];
  8. NSData *data = [readingHandlereadDataToEndOfFile];
  9. [readingHandlecloseFile];
  10. }
  11. return 0;
  12. }

步骤二:将数据写入新的文件

首先使用NSfileManager创建一个新的文件,然后使用写入文件对接器writingHandle将data数据写入tarena.txt文件中,代码如下所示:

 
  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. NSString *documentPath = @"/Users/Tarena/Desktop";
  4. NSString * fileName = @"combine.txt";
  5. NSString * path = [documentPathstringByAppendingPathComponent:fileName];
  6. //读取文件数据
  7. NSFileHandle *readingHandle = [NSFileHandlefileHandleForReadingAtPath:path];
  8. NSData *data = [readingHandlereadDataToEndOfFile];
  9. [readingHandlecloseFile];
  10. //创建新文件
  11. NSFileManager *fileManager = [NSFileManagerdefaultManager];
  12. NSString *newPath = [documentPathstringByAppendingPathComponent:@"tarena.txt"];
  13. [fileManagercreateFileAtPath:newPathcontents:nilattributes:nil];
  14. //将数据写入新文件
  15. NSFileHandle *writingHandle = [NSFileHandlefileHandleForWritingAtPath:newPath];
  16. [writingHandlewriteData:data];
  17. [writingHandlecloseFile];
  18. }
  19. return 0;
  20. }

3.4 完整代码

本案例中,main.m文件中的完整代码如下所示:

 
  1. #import<Foundation/Foundation.h>
  2. int main(intargc, const char * argv[]) {
  3. @autoreleasepool {
  4. NSString *documentPath = @"/Users/Tarena/Desktop";
  5. NSString * fileName = @"combine.txt";
  6. NSString * path = [documentPathstringByAppendingPathComponent:fileName];
  7. //读取文件数据
  8. NSFileHandle *readingHandle = [NSFileHandlefileHandleForReadingAtPath:path];
  9. NSData *data = [readingHandlereadDataToEndOfFile];
  10. [readingHandlecloseFile];
  11. //创建新文件
  12. NSFileManager *fileManager = [NSFileManagerdefaultManager];
  13. NSString *newPath = [documentPathstringByAppendingPathComponent:@"tarena.txt"];
  14. [fileManagercreateFileAtPath:newPathcontents:nilattributes:nil];
  15. //将数据写入新文件
  16. NSFileHandle *writingHandle = [NSFileHandlefileHandleForWritingAtPath:newPath];
  17. [writingHandlewriteData:data];
  18. [writingHandlecloseFile];
  19. }
  20. return 0;
  21. }

4 演示IOS应用的沙箱目录

4.1 问题

IOS的每一个应用程序在安装时由系统分配一个ID,每一个应用都对应一个沙箱目录,沙箱目录由Document、Library、tmp三个子目录组成,本案例演示IOS应用的沙箱目录。

4.2 方案

因为沙箱目录是针对IOS应用程序的,只有在模拟器中运行的程序才能查看到沙箱目录,所以本案例不能使用命令行程序,需要创建一个SingleViewApplication应用在模拟器中运行。将所有代码写在viewDidLoad方法中,暂且将viewDidLoad方法当成main函数使用。

IOS为开发者提供了获取沙箱目录的函数,获取应用程序的根目录使用函数NSHomeDirectory(),根目录的名称就是应用程序的ID号。

获取Documents目录可以使用如下方法:

先使用函数NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)得到的是一个只有一个元素的数组array,然后从数组中取出这个元素就是Documents目录。

获取Library目录和Cache缓存目录的方法和Document目录类似,也是使用NSSearchPathForDirectoriesInDomains()函数,不过第一个参数分别传递的是NSLibraryDirectory和NSCachesDirectory。

获取临时文件tmp目录怎比较简单,直接使用NSTemporaryDirectory()函数即可。

4.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:分别获取应用程序的沙箱目录

首先获取应用程序的根目录使用函数NSHomeDirectory(),根目录的名称就是应用程序的ID号,代码如下所示:

 
  1. - (void)viewDidLoad {
  2. [superviewDidLoad];
  3. // 获取应用程序的根路径
  4. NSString * homePath = NSHomeDirectory();
  5. NSLog(@"%@", homePath);
  6. }

运行程序,在控制台可以看到该应该的ID号为“F086E411-1AFA-478A-8F52-4F3C5511A07D“。

然后使用函数NSSearchPathForDirectoriesInDomains()获取Documents目录,并且在控制台输出查看,代码如下所示:

 
  1. - (void)viewDidLoad {
  2. [superviewDidLoad];
  3. // 获取应用程序的根路径
  4. NSString * homePath = NSHomeDirectory();
  5. NSLog(@"%@", homePath);
  6. //获取文档Document目录
  7. NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  8. NSLog(@"array[0]:%@",array[0]);
  9. }

再使用函数NSSearchPathForDirectoriesInDomains()分别获取Library目录和Cache目录,并且在控制台输出查看,代码如下所示:

 
  1. - (void)viewDidLoad {
  2. [superviewDidLoad];
  3. // 获取应用程序的根路径
  4. NSString * homePath = NSHomeDirectory();
  5. NSLog(@"%@", homePath);
  6. //获取文档Document目录
  7. NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  8. NSLog(@"array[0]:%@",array[0]);
  9. //获取Library目录
  10. array = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
  11. NSLog(@"array[0]:%@",array[0]);
  12. //获取缓存目录
  13. array = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
  14. NSLog(@"array[0]:%@",array[0]);
  15. }

最后获取tmp目录在控制台输出查看,代码如下所示:

  1. - (void)viewDidLoad {
  2. [superviewDidLoad];
  3. // 获取应用程序的根路径
  4. NSString * homePath = NSHomeDirectory();
  5. NSLog(@"%@", homePath);
  6. //获取文档Document目录
  7. NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  8. NSLog(@"array[0]:%@",array[0]);
  9. //获取Library目录
  10. array = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
  11. NSLog(@"array[0]:%@",array[0]);
  12. //获取缓存目录
  13. array = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
  14. NSLog(@"array[0]:%@",array[0]);
  15. // 获取临时tmp目录
  16. NSLog(@"%@", NSTemporaryDirectory());
  17. }

4.4 完整代码

本案例中,ViewController.m文件中的完整代码如下所示:

 
  1. #import "ViewController.h"
  2. @implementationViewController
  3. - (void)viewDidLoad {
  4. [superviewDidLoad];
  5. // 获取应用程序的根路径
  6. NSString * homePath = NSHomeDirectory();
  7. NSLog(@"%@", homePath);
  8. //获取文档Document目录
  9. NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  10. NSLog(@"array[0]:%@",array[0]);
  11. //获取Library目录
  12. array = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
  13. NSLog(@"array[0]:%@",array[0]);
  14. //获取缓存目录
  15. array = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
  16. NSLog(@"array[0]:%@",array[0]);
  17. // 获取临时tmp目录
  18. NSLog(@"%@", NSTemporaryDirectory());
  19. }
  20. @end

5 使用属性列表的方式保存文件

5.1 问题

属性列表(Plist)其实是一种XML(可扩展标记语言)格式的文件,将对象放入列表中,然后通过NSArray和NSDictionary集合直接存储为属性列表文件。本案例演示使用属性列表的方式保存文件。

5.2 方案

首先创建一个NSArray类型的对象array,保存一组字符串数据,然后使用writeToFile:atomically:方法写入属性文件,注意属性文件的扩展名为plist。

再使用方法arrayWithContentsOfFile:读取属性文件的数据,并且在控制台输出查看结果。

然后创建一个NSDictionary对象dictionary,保存一组键值对数据,然后使用writeToFile:atomically:方法写入属性文件,注意属性文件的扩展名为plist。。

最后使用方法dictionaryWithContentsOfFile:读取属性文件的数据,并且在控制台输出查看结果。

5.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:NSArray数据写入属性文件

首先创建一个NSArray类型的对象array,保存一组字符串数据,然后使用writeToFile:atomically:方法写入属性文件,注意属性文件的扩展名为plist,代码如下所示:

  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. NSString *path = @"/Users/Tarena/Desktop";
  4. NSArray *array = @[@"apple",@"iphone",@"iMac",@"iPad",@"iPad Mini",@"iTouch",@"apple watch"];
  5. //写入属性列表
  6. [arraywriteToFile:[path stringByAppendingPathComponent:@"applehome.plist"] atomically:YES];
  7. }
  8. return 0;
  9. }

运行程序,桌面上会新增一个applehome.plist文件,打开plist文件左边展示的是数组元素序号,中间是数组元素类型,右边是数组元素,效果如图-4所示:

图-4

再使用方法arrayWithContentsOfFile:读取属性文件的数据,并且在控制台输出查看结果,代码如下所示:

 
  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. NSString *path = @"/Users/Tarena/Desktop";
  4. NSArray *array = @[@"apple",@"iphone",@"iMac",@"iPad",@"iPad Mini",@"iTouch",@"apple watch"];
  5. //写入属性列表
  6. [arraywriteToFile:[path stringByAppendingPathComponent:@"applehome.plist"] atomically:YES];
  7. //读取属性列表
  8. array = [NSArrayarrayWithContentsOfFile:[path stringByAppendingPathComponent:@"applehome.plist"]];
  9. NSLog(@"%@",array);
  10. }
  11. return 0;
  12. }

运行程序,控制台将读取的数组数据输出,结果如图-5所示,

图-5

步骤二:NSDictionary数据写入属性文件

首先创建一个NSDictionary类型的对象dictionary,保存一组键值对数据,然后使用writeToFile:atomically:方法写入属性文件,注意属性文件的扩展名为plist,代码如下所示:

 
  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. NSString *path = @"/Users/Tarena/Desktop";
  4. NSArray *array = @[@"apple",@"iphone",@"iMac",@"iPad",@"iPad Mini",@"iTouch",@"apple watch"];
  5. //写入属性列表
  6. [arraywriteToFile:[path stringByAppendingPathComponent:@"applehome.plist"] atomically:YES];
  7. NSDictionary *dictionary = @{@"name1":@"apple",@"name2":@"iphone",@"name3":@"iMac",@"name4":@"iPad",@"name5":@"iPad Mini",@"name6":@"iTouch",@"name7":@"apple watch"};
  8. //写入属性列表
  9. [dictionarywriteToFile:[path stringByAppendingPathComponent:@"applehome2.plist"] atomically:YES];
  10. }
  11. return 0;
  12. }

运行程序,桌面上会新增一个applehome2.plist文件,打开plist文件左边展示的key值,中间是value的类型,右边是value值,效果如图-6所示:

图-6

再使用方法dictionaryWithContentsOfFile:读取属性文件的数据,并且在控制台输出查看结果,代码如下所示:

 
  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. NSString *path = @"/Users/Tarena/Desktop";
  4. NSArray *array = @[@"apple",@"iphone",@"iMac",@"iPad",@"iPad Mini",@"iTouch",@"apple watch"];
  5. //写入属性列表
  6. [arraywriteToFile:[path stringByAppendingPathComponent:@"applehome.plist"] atomically:YES];
  7. //读取属性列表
  8. array = [NSArrayarrayWithContentsOfFile:[path stringByAppendingPathComponent:@"applehome.plist"]];
  9. NSLog(@"%@",array);
  10. NSDictionary *dictionary = @{@"name1":@"apple",@"name2":@"iphone",@"name3":@"iMac",@"name4":@"iPad",@"name5":@"iPad Mini",@"name6":@"iTouch",@"name7":@"apple watch"};
  11. //写入属性列表
  12. [dictionarywriteToFile:[path stringByAppendingPathComponent:@"applehome2.plist"] atomically:YES];
  13. //读取属性列表
  14. dictionary = [NSDictionarydictionaryWithContentsOfFile:[path stringByAppendingPathComponent:@"applehome2.plist"]];
  15. NSLog(@"%@",dictionary);
  16. }
  17. return 0;
  18. }

运行程序,控制台将读取的数组数据输出,结果如图-7所示,

图-7

5.4 完整代码

本案例中,main.m文件中的完整代码如下所示:

 
  1. #import<Foundation/Foundation.h>
  2. int main(intargc, const char * argv[]) {
  3. @autoreleasepool {
  4. NSString *path = @"/Users/Tarena/Desktop";
  5. NSArray *array = @[@"apple",@"iphone",@"iMac",@"iPad",@"iPad Mini",@"iTouch",@"apple watch"];
  6. //写入属性列表
  7. [arraywriteToFile:[path stringByAppendingPathComponent:@"applehome.plist"] atomically:YES];
  8. //读取属性列表
  9. array = [NSArrayarrayWithContentsOfFile:[path stringByAppendingPathComponent:@"applehome.plist"]];
  10. NSLog(@"%@",array);
  11. NSDictionary *dictionary = @{@"name1":@"apple",@"name2":@"iphone",@"name3":@"iMac",@"name4":@"iPad",@"name5":@"iPad Mini",@"name6":@"iTouch",@"name7":@"apple watch"};
  12. //写入属性列表
  13. [dictionarywriteToFile:[path stringByAppendingPathComponent:@"applehome2.plist"] atomically:YES];
  14. //读取属性列表
  15. dictionary = [NSDictionarydictionaryWithContentsOfFile:[path stringByAppendingPathComponent:@"applehome2.plist"]];
  16. NSLog(@"%@",dictionary);
  17. }
  18. return 0;
  19. }

NSFileHandle 、 沙箱机制 、 属性列表的更多相关文章

  1. iOS开发备忘录:属性列表文件数据持久化

    属性列表文件是一种XML文件,Foundation框架中的数组和字典等都可以于属性列表文件相互转换. NSArray类常用读写属性列表文件的方法: +arrayWithContentsOfFile:类 ...

  2. iOS-数据持久化-属性列表

    属性列表 属性列表文件是一种XML文件,Foundation框架中的数组和字典等都可以于属性列表文件相互转换. NSArray类常用读写属性列表文件的方法: +arrayWithContentsOfF ...

  3. iOS开发中的4种数据持久化方式【一、属性列表与归档解档】

    iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据.在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹.ios开发中, ...

  4. iOS数据存储之属性列表理解

    iOS数据存储之属性列表理解 数据存储简介 数据存储,即数据持久化,是指以何种方式保存应用程序的数据. 我的理解是,开发了一款应用之后,应用在内存中运行时会产生很多数据,这些数据在程序运行时和程序一起 ...

  5. iOS 数据持久化(1):属性列表与对象归档

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...

  6. iOS 数据持久性存储-属性列表

    iOS上常用四种数据存取方法有: 1.属性列表 2.对象归档 3.iOS的嵌入式关系数据库(SQLite3) 4.苹果公司提供持久性共聚Core Data 由于苹果公司的沙盒机制,每个应用程序都有自己 ...

  7. iphone开发中数据持久化之——属性列表序列化(一)

    数据持久化是应用程序开发过程中的一个基本问题,对应用程序中的数据进行持久化存储,有多重不同的形式.本系列文章将介绍在iphone开发过程中数据持久化的三种主要形式,分别是属性列表序列号.对象归档化以及 ...

  8. 对java沙箱机制的一点了解

    1.   引入 我们都知道,程序员编写一个Java程序,默认的情况下可以访问该机器的任意资源,比如读取,删除一些文件或者网络操作等.当你把程序部署到正式的服务器上,系统管理员要为服务器的安全承担责任, ...

  9. K:java中的安全模型(沙箱机制)

    本博文整合自:Java安全--理解Java沙箱.Java 安全模型介绍.Java的沙箱机制原理入门 相关介绍:  我们都知道,程序员编写一个Java程序,默认的情况下可以访问该机器的任意资源,比如读取 ...

随机推荐

  1. Objective-C( 语法一)

    点语法 点语法的本质是方法调用 成员变量的作用域 @public : 在任何地方都能直接访问对象的成员变量 @private : 只能在当前类的对象方法中直接访问(@implementation中默认 ...

  2. Octopus系列之系统中的价格

    系统中的价格 产品原价格  计算=Round(数据库数值[默认USD]*汇率)[Round的意思说:对价格做小数位的截取]产品原价格  展示=Currency(产品原价格  计算)[给大家说明一下什么 ...

  3. 闲聊CSS之关于clearfix--清除浮动[转]

    .clearfix:after { content: " "; display: block; clear: both; height:; } .clearfix { zoom:; ...

  4. web开发-前端到服务器Controller中的数据传递

    一, ajax方式 1. ajax获取页面中的数据,包括表单中的数据, 然后封装成对象,数组, 字符串, 或其他基本类型的数据. 2. 将封装得到的数据通过ajax传递到controller中(注:在 ...

  5. 知名杀毒软件Mcafee(麦咖啡)个人版 资源汇总兼科普(来自卡饭)

    虽然早已不是用咖啡了,但我也实时关注的咖啡的一举一动,潜水看帖日久,发现小白众多,好多有价值的帖子淹没于帖海当中,甚是惋惜.     我有如下建议      1.咖啡区管理层,能否吧一些优秀的资源教程 ...

  6. The bundle does not contain an app icon for iPhone / iPod Touch of exactly '57x57' pixels

    遇到这个问题问题,搜索了一圈要么不知道,要么喊改deploymenet target, 最后我是在项目属性-info-icon files(ios5)-下面添加了一个icon,然后弄了个icon.pn ...

  7. hdu 4611 Balls Rearrangement

    http://acm.hdu.edu.cn/showproblem.php?pid=4611 从A中向B中移动和从B中向A中移动的效果是一样的,我们假设从B中向A中移动 而且A>B 我们先求出所 ...

  8. synergy配置 Ubuntu作Server, Win 7作client

    Synergy 允许你轻松地在你办公桌上多台计算机之间共享你的鼠标和键盘,它免费并且开放源代码.你只要将鼠标(指针)从一台计算机的屏幕边缘移出到另一个屏幕就行 了.甚至可以共享你的剪贴板.你所需要的仅 ...

  9. [转载]查看基于Android 系统单个进程内存、CPU使用情况的几种方法

    转载自: http://www.linuxidc.com/Linux/2011-11/47587.htm 一.利用Android API函数查看1.1 ActivityManager查看可用内存. A ...

  10. python处理url中的中文编码,以及其他编码问题

    1.python中的urlencode与urldecode 2.各种编码转换在线工具 3.python用于url解码和中文解析的小脚本(python url decoder) 4.如何只对url中的中 ...