• NSFileHandle 、 沙箱机制 、 属性列表


    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. }
    
    
  • 相关阅读:
    Linux kernel AACRAID Driver Compat IOCTL 本地安全绕过漏洞
    WordPress Contact Form 7插件任意文件上传漏洞
    文件上传
    Po类设计
    MySQL 表设计
    Mybatis——更新DB表的字段时,应该注意的点
    分页——为Mybatis配置PageHelper
    SpringAOP配置与使用(示例)
    日志问题
    为一台全新的电脑构建JavaEE开发环境
  • 原文地址:https://www.cnblogs.com/52190112cn/p/5049513.html
Copyright © 2020-2023  润新知