OC中文件操作,在之前的文章中,已经接触到了文件的创建了,但是那不是很具体和详细,这篇文章我们就来仔细看一下OC中是如何操作文件的:

第一、首先来看一下本身NSString类给我们提供了哪些可以操作文件路径名的方法

[objc]  view plaincopy  
8.   
9. #import <Foundation/Foundation.h>  
10.   
11. int main(int argc, const charchar * argv[]) {  
12.     @autoreleasepool {  
13.           
14.         //演示路径  
15.         NSString *path = @"/Users/jiangwei/file.text";  
16.           
17.         //1.返回路径的组成部分  
18.         NSArray *array = [path pathComponents];  
19.         NSLog(@"%@",array);  
20.           
21.         //2.返回路径最后组成部分  
22.         NSString *str = [path lastPathComponent];  
23.         NSLog(@"%@",str);  
24.           
25.         //3.在原有的路径后面追加子目录  
26.         //这种方式有一点不好,就是需要添加/  
27.         [path stringByAppendingString:@"/appFile.text"];  
28.         //不需要添加/  
29.         [path stringByAppendingPathComponent:@"appFile.text"];  
30.           
31.         //4.删除最后的组成部分  
32.         str = [path stringByDeletingLastPathComponent];  
33.         //删除扩展名(.text被删除了)  
34.         str = [path stringByDeletingPathExtension];  
35.           
36.         //5.获取扩展名  
37.         str = [path pathExtension];  
38.           
39.         //6.添加扩展名  
40.         [path stringByAppendingPathExtension:@".jpg"];  
41.           
42.     }  
43.     return 0;  
44. }  
在Java中,我们知道,当我们去操作一个文件的时候,最开始的时候肯定要去构建一个路径,这个路径一般都是String类型的,我们需要定义不同的路径和文件名,OC中也不例外,不过OC中的NSString类在这方面做的可能会更好,下面依次来看一下他的方法:
1、将路径进行分割
[java]  view plaincopy 
1. //演示路径  
2. NSString *path = @"/Users/jiangwei/file.text";  
3.   
4. //1.返回路径的组成部分  
5. NSArray *array = [path pathComponents];  
6. NSLog(@"%@",array);  
运行结果:

返回的一个数组,将路径分割了,但是需要注意的是,第一个是"/",这个也算是路径的一部分。

2、返回路径的最后组成部分
[objc]  view plaincopy 
1. //2.返回路径最后组成部分  
2. NSString *str = [path lastPathComponent];  
3. NSLog(@"%@",str);  
运行结果:

这个直接返回路径的最后一部分,这个如果放在Java中,我们可能需要用到String类的字符串分割技术了,没有这里的方便

3、添加子目录/子文件
[objc]  view plaincopy 
1. //3.在原有的路径后面追加子目录  
2. //这种方式有一点不好,就是需要添加/  
3. //演示路径  
4. str = [path stringByAppendingString:@"/appFile.text"];  
5. NSLog(@"%@",str);  
6. //不需要添加/  
7. str = [path stringByAppendingPathComponent:@"appFile.text"];  
8. NSLog(@"%@",str);  
这里其实有两种方式可以添加,第一种是直接使用拼接字符串的方式,但是需要手动的添加"/",第二种方式是NSString提供的,不需要手动的添加"/"
运行结果:

4、删除最后面的部分和后缀名
[objc]  view plaincopy 
1. //4.删除最后的组成部分  
2. str = [path stringByDeletingLastPathComponent];  
3. NSLog(@"%@",str);  
4. //删除扩展名(.text被删除了)  
5. str = [path stringByDeletingPathExtension];  
6. NSLog(@"%@",str);  
运行结果:

5、获取扩展名
[objc]  view plaincopy 
1. //5.获取扩展名  
2. str = [path pathExtension];  
3. NSLog(@"%@",str);  
运行结果:

6、添加扩展名
[objc]  view plaincopy 
1. //6.添加扩展名  
2. str = [path stringByAppendingPathExtension:@"jpg"];  
3. NSLog(@"%@",str);  
运行结果:

上面就是总结了NSString类中操作文件路径的一些方法,其实这些操作如果放在Java中做的话,就是需要使用String的分割,拼接等技术了。这里看到OC给我们提供了便捷

第二、在来看一下操作文件之前需要了解的一个对象:NSData
这个类的作用就是将我们写入到文件中的数据进行编码和解码操作
[objc]  view plaincopy 
1. //  
2. //  main.m  
3. //  38_NSData  
4. //  
5. //  Created by jiangwei on 14-10-13.  
6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
7. //  
8.   
9. #import <Foundation/Foundation.h>  
10.   
11. //NSData类型  
12. //是一种存储形式  
13. int main(int argc, const charchar * argv[]) {  
14.     @autoreleasepool {  
15.         //存储是有编码方式的,编程字节码  
16.         //相当于Java中的解码和编码  
17.         NSString *s = @"tsdfsdfsdfsdf";  
18.         NSData *data = [s dataUsingEncoding:NSUTF8StringEncoding];  
19.         s = [[NSString alloc] initWithData:data encoding:(NSUTF8StringEncoding)];  
20.           
21.         //可变对象 NSMutableData 可以追加数据  
22.     }  
23.     return 0;  
24. }  
这个和Java中String直接在构造的时候就可以进行编码和解码了,这里需要使用中间类NSData,当然这个类是不可变的,如果想追加内容的话,需要使用NSMutableData类

第三、说完了NSData这个中间类,下面来正式说文件的操作了
但是这里对文件的操作,我们放到IOS平台去操作,因为我们后面也是会介绍IOS中文件的操作,所以就直接在这里说了,当然这里的知识会有点冲突,但是我们不关心IOS中的其他技术,只看他的文件操作:
1、沙盒文件
在IOS中,每个应用程序都是一个沙盒,他们有自己的文件目录,这个目录对其他程序是不可见的,和Android中的/data/data/包名/中的内容差不多,当然IOS中的沙盒目录有三种:
Documents:存放长期使用的文件(一般存放目录)
Library:系统存放文件
tmp:临时文件,app重启时,该目录下得文件清空
下面来看一个简单的例子吧:
[objc]  view plaincopy 
1. //  
2. //  main.m  
3. //  36_SandBoxFile  
4. //  
5. //  Created by jiangwei on 14-10-13.  
6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
7. //  
8.   
9. #import <UIKit/UIKit.h>  
10. #import "AppDelegate.h"  
11.   
12. int main(int argc, charchar * argv[]) {  
13.     @autoreleasepool {  
14.         //获取沙盒目录  
15.         //默认有三个文件夹  
16.         //Documents:存放长期使用的文件(一般存放目录)  
17.         //Library:系统存放文件  
18.         //tmp:临时文件,app重启时,该目录下得文件清空  
19.           
20.         //第一种获取方式,我们得到Home目录之后,手动的去拼接Document/Library  
21.         NSString *homePath = NSHomeDirectory();  
22.         NSLog(@"沙盒目录:%@",homePath);  
23.           
24.         //第二种方式,直接使用Api获取  
25.         //NSDocumentDirectory:Documents文件夹  
26.         //NSLibraryDirectory:Library文件夹  
27.         NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
28.         NSLog(@"%@",array);  
29.           
30.         NSArray *array1 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);  
31.         NSLog(@"%@",array1);  
32.           
33.         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));  
34.     }  
35. }  
创建IOS项目和OC差不多:
后续的操作就一样了,创建完之后的项目结构:

我们在main.m文件中写我们的代码就可以了。

下面来看代码:
[java]  view plaincopy 
1. //第一种获取方式,我们得到Home目录之后,手动的去拼接Document/Library  
2. NSString *homePath = NSHomeDirectory();  
3. NSLog(@"沙盒目录:%@",homePath);  
获取沙盒的home目录,然后我们可以操作在其下面创建子目录了

这里有两种方式去创建Document等目录,一种是我们用上面NSString类提供的方法去手动拼接目录
还有一种是用系统给我们提供的方法,这两种都是可以的
[java]  view plaincopy 
1. //第二种方式,直接使用Api获取  
2. //NSDocumentDirectory:Documents文件夹  
3. //NSLibraryDirectory:Library文件夹  
4. NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
5. NSLog(@"%@",array);  
6.           
7. NSArray *array1 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);  
8. NSLog(@"%@",array1);

看一下运行结果:

第四、了解了程序的沙盒目录,下面继续来看一下操作文件的两个类
一、NSFileManager
这个类的主要功能是对文件进行操作:创建,复制,剪切,删除等
看代码:
[objc]  view plaincopy 
1. //  
2. //  main.m  
3. //  39_NSFileManager  
4. //  
5. //  Created by jiangwei on 14-10-13.  
6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
7. //  
8.   
9. #import <UIKit/UIKit.h>  
10. #import "AppDelegate.h"  
11.   
12. //NSFileManager:对文件进行操作的,包括复制,粘贴,删除,剪切等操作  
13. int main(int argc, charchar * argv[]) {  
14.     @autoreleasepool {  
15.           
16.         //------------------创建文件/文件夹  
17.         //获取沙盒目录  
18.         NSString *homePath = NSHomeDirectory();  
19.         //在沙盒目录中创建一个文件file.text  
20.         NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];  
21.         //NSFileManager是单利模式,所以不能使用alloc+init创建  
22.         NSFileManager *manager = [NSFileManager defaultManager];  
23.         NSString *str = @"无线互联";  
24.         NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];  
25.         //参数:文件路径、文件内容、文件的属性  
26.         BOOL sucess = [manager createFileAtPath:filePath contents:data attributes:nil];  
27.         if(sucess){  
28.             NSLog(@"文件创建成功");  
29.         }else{  
30.             NSLog(@"文件创建失败");  
31.         }  
32.           
33.         //创建文件夹  
34.         NSString *filePaths = [homePath stringByAppendingPathComponent:@"Documents/file"];  
35.         NSError *error;  
36.         //需要传递一个创建失败的指针对象,记录创建失败的信息  
37.         BOOL success1 = [manager createDirectoryAtPath:filePaths withIntermediateDirectories:YES attributes:nil error:&error];  
38.         if(!success1){  
39.             NSLog(@"创建成功");  
40.         }else{  
41.             NSLog(@"创建失败");  
42.         }  
43.           
44.           
45.         //--------------------读取文件  
46.         //根据路径读取文件内容  
47.         NSData *datas = [manager contentsAtPath:filePath];  
48.         NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
49.         NSLog(@"%@",s);  
50.           
51.           
52.         //--------------------移动文件/剪切文件  
53.         //NSFileManager中没有提供重命名的方法,所以我们可以借助移动的api进行操作  
54.         //把filePath移动到targetPath目录中  
55.         NSString *targetPath = [homePath stringByAppendingPathComponent:@"Documents/file/file2.text"];  
56.         BOOL sucess2 = [manager moveItemAtPath:filePath toPath:targetPath error:nil];  
57.         if(sucess2) {  
58.             NSLog(@"移动成功");  
59.         }else{  
60.             NSLog(@"移动失败");  
61.         }  
62.           
63.           
64.         //--------------------复制文件  
65.         BOOL sucess3 = [manager copyItemAtPath:filePath toPath:targetPath error:nil];  
66.         if(sucess3){  
67.             //复制成功  
68.         }else{  
69.             //复制失败  
70.         }  
71.           
72.           
73.         //--------------------删除文件  
74.         //删除之前需要判断这个文件是否存在  
75.         BOOL isExist = [manager fileExistsAtPath:filePath];//判断文件是否存在  
76.         if(isExist){  
77.             BOOL sucess4 = [manager removeItemAtPath:filePath error:nil];  
78.             if(sucess4){  
79.                 //删除成功  
80.             }else{  
81.                 //删除失败  
82.             }  
83.         }  
84.           
85.           
86.         //--------------------获取文件的属性  
87.         NSDictionary *dic = [manager attributesOfItemAtPath:filePath error:nil];  
88.         NSLog(@"%@",dic);//通过打印我们就可以查看文件属性的一些key  
89.           
90.         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));  
91.     }  
92. }

1、创建文件
[objc]  view plaincopy 
1. //------------------创建文件/文件夹  
2. //获取沙盒目录  
3. NSString *homePath = NSHomeDirectory();  
4. //在沙盒目录中创建一个文件file.text  
5. NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];  
6. //NSFileManager是单利模式,所以不能使用alloc+init创建  
7. NSFileManager *manager = [NSFileManager defaultManager];  
8. NSString *str = @"无线互联";  
9. NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];  
10. //参数:文件路径、文件内容、文件的属性  
11. BOOL sucess = [manager createFileAtPath:filePath contents:data attributes:nil];  
12. if(sucess){  
13.     NSLog(@"文件创建成功");  
14. }else{  
15.     NSLog(@"文件创建失败");  
16. }  
NSFileManager内部使用了单例模式,这个后面会说到OC中得单例模式,然后就是构建一个NSData类,最后使用createFileAtPath方法创建文件,不过最后的attributes参数一般是用来给这个文件定义一些属性的,当然文件本身也是有很多默认的属性,比如文件的大小,文件的创建日期等,我们也可以自己在追加一些属性。

2、创建文件夹
[java]  view plaincopy 
1. //创建文件夹  
2. NSString *filePaths = [homePath stringByAppendingPathComponent:@"Documents/file"];  
3. NSError *error;  
4. //需要传递一个创建失败的指针对象,记录创建失败的信息  
5. BOOL success1 = [manager createDirectoryAtPath:filePaths withIntermediateDirectories:YES attributes:nil error:&error];  
6. if(!success1){  
7.     NSLog(@"创建成功");  
8. }else{  
9.     NSLog(@"创建失败");  
10. }  
从这两个操作看出来,他和Java中的File类很相似的

3、读取文件
[java]  view plaincopy 
1. //--------------------读取文件  
2. //根据路径读取文件内容  
3. NSData *datas = [manager contentsAtPath:filePath];  
4. NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
5. NSLog(@"%@",s);

4、剪切文件
[objc]  view plaincopy 
1. //--------------------移动文件/剪切文件  
2. //NSFileManager中没有提供重命名的方法,所以我们可以借助移动的api进行操作  
3. //把filePath移动到targetPath目录中  
4. NSString *targetPath = [homePath stringByAppendingPathComponent:@"Documents/file/file2.text"];  
5. BOOL sucess2 = [manager moveItemAtPath:filePath toPath:targetPath error:nil];  
6. if(sucess2) {  
7.     NSLog(@"移动成功");  
8. }else{  
9.     NSLog(@"移动失败");  
10. }  
这里有两个参数:一个是需要移动文件的路径,和需要移动到哪的路径

5、复制文件
[objc]  view plaincopy 
1. //--------------------复制文件  
2. BOOL sucess3 = [manager copyItemAtPath:filePath toPath:targetPath error:nil];  
3. if(sucess3){  
4.     //复制成功  
5. }else{  
6.     //复制失败  
7. }

6、删除文件
[objc]  view plaincopy 
1. //--------------------删除文件  
2. //删除之前需要判断这个文件是否存在  
3. BOOL isExist = [manager fileExistsAtPath:filePath];//判断文件是否存在  
4. if(isExist){  
5.     BOOL sucess4 = [manager removeItemAtPath:filePath error:nil];  
6.     if(sucess4){  
7.         //删除成功  
8.     }else{  
9.         //删除失败  
10.     }  
11. }

7、操作文件的属性

[objc]  view plaincopy 
1. //--------------------获取文件的属性  
2. NSDictionary *dic = [manager attributesOfItemAtPath:filePath error:nil];  
3. NSLog(@"%@",dic);//通过打印我们就可以查看文件属性的一些key  
属性一般是NSDictionary

二、NSFileHandle
这个类主要是对文件进行读写操作的
看代码:
[objc]  view plaincopy 
1. //  
2. //  main.m  
3. //  40_NSFileHandle  
4. //  
5. //  Created by jiangwei on 14-10-13.  
6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
7. //  
8.   
9. #import <UIKit/UIKit.h>  
10. #import "AppDelegate.h"  
11.   
12. //写文件,我们之前使用各种数据结构来存储数据:NSString,NSData,NSDictionary,NSArray等,他们都是有一个writeToFile方法用来写文件的  
13.   
14. //纯文本:没有任何格式的数据  
15. //非纯文本:有修饰的数据(字体大小,字体颜色等)  
16.   
17. //数组只能将如下类型写入文件,如果包含其他对象,将写入失败:NSNumber,NSString,NSData,NSDate,NSArray,NSDictionary  
18. //数组、字典写入的文件叫做属性文件,可以使用xcode进行编辑  
19. int main(int argc, charchar * argv[]) {  
20.     @autoreleasepool {  
21.           
22.         //1.-------------------字符串读写文件  
23.         NSString *str = @"无线互联";  
24.         NSString *homePath = NSHomeDirectory();  
25.         NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];  
26.         //现在有这样的场景,第一次把字符串写入到文件中,当我们修改字符串之后,再次写入的时候,但是可能会写入失败  
27.         //但是之前的内容也有可能丢失,因为每次在写入新的内容的时候,会剪切之前的内容,所以这里就有可能新的没有写  
28.         //成功,旧的文件也丢失了  
29.         //所以这时候atomically参数:  
30.         //YES:会将新内容先写入到一个缓存文件中,如果写入缓存成功之后,这时候就将这个缓存文件替换旧文件,这样就很安全了  
31.         BOOL sucess = [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];  
32.         if(sucess){  
33.             //写入成功  
34.         }else{  
35.             //写入失败  
36.         }  
37.         //读取文件内容到字符串中  
38.         //类方法  
39.         NSString *str1 = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];  
40.         //构造方法  
41.         //str1 = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];  
42.         NSLog(@"%@",str1);  
43.           
44.           
45.         //2.--------------------NSData读写  
46.         //创建NSData的同时读取文件中的内容  
47.         NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];  
48.         //NSData转化成NSString  
49.         NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
50.         NSLog(@"%@",s);  
51.           
52.         //写文件  
53.         BOOL sucess1 = [data writeToFile:filePath atomically:YES];  
54.         if(sucess1){  
55.             //写入成功  
56.         }else{  
57.             //写入失败  
58.         }  
59.           
60.           
61.         //3.--------------------NSArray读写文件  
62.         NSArray *array = @[@"zhangsan",@"lisi"];  
63.         //属性文件一般后缀名为.plist  
64.         NSString *filePaths = [homePath stringByAppendingPathComponent:@"Documents/array.plist"];  
65.         BOOL sucess2 = [array writeToFile:filePaths atomically:YES];  
66.         if(sucess2){  
67.             //写入成功  
68.         }else{  
69.             //写入失败  
70.         }  
71.         //读文件  
72.         NSArray *arrays = [[NSArray alloc] initWithContentsOfFile:filePath];  
73.         NSLog(@"%@",arrays);  
74.           
75.           
76.         //4.---------------------NSDictionary读写文件  
77.         NSDictionary *dic = @{@"zhang":@"zhangsan",@"li":@"lisi"};  
78.         BOOL sucess3 = [dic writeToFile:filePath atomically:YES];  
79.         if(sucess3){  
80.             //写入成功  
81.         }else{  
82.             //写入失败  
83.         }  
84.           
85.         //读文件  
86.         dic = [[NSDictionary alloc] initWithContentsOfFile:filePath];  
87.         NSLog(@"%@",dic);  
88.           
89.           
90.         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));  
91.     }  
92. }  
这个类就和Java中的FileInputStream/FileOutputStream类似了
其实我们在之前看到归档和解档操作的时候,那就是相当于写文件和读文件操作了。

1、字符串直接写入文件
[objc]  view plaincopy 
1. //1.-------------------字符串读写文件  
2. NSString *str = @"无线互联";  
3. NSString *homePath = NSHomeDirectory();  
4. NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];  
5. //现在有这样的场景,第一次把字符串写入到文件中,当我们修改字符串之后,再次写入的时候,但是可能会写入失败  
6. //但是之前的内容也有可能丢失,因为每次在写入新的内容的时候,会剪切之前的内容,所以这里就有可能新的没有写  
7. //成功,旧的文件也丢失了  
8. //所以这时候atomically参数:  
9. //YES:会将新内容先写入到一个缓存文件中,如果写入缓存成功之后,这时候就将这个缓存文件替换旧文件,这样就很安全了  
10. BOOL sucess = [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];  
11. if(sucess){  
12.     //写入成功  
13. }else{  
14.     //写入失败  
15. }  
16. //读取文件内容到字符串中  
17. //类方法  
18. NSString *str1 = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];  
19. //构造方法  
20. //str1 = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];  
21. NSLog(@"%@",str1);  
我们使用拼接的方式创建Documents目录中的file.text文件,然后将字符串内容写入到其中。
writeToFile方法进行写入
其实OC中的各种数据结构都有这个方法的:NSString,NSData,NSArray,NSSet,NSDirctionary等
这里有两点要注意的:
1)
数组只能将如下类型写入文件,如果包含其他对象,将写入失败:NSNumber,NSString,NSData,NSDate,NSArray,NSDictionary
数组、字典写入的文件叫做属性文件,可以使用xcode进行编辑

这个就是系统提供的一个属性文件:info.plist
这个和Java中的Property文件很类似

2)writeToFile方法的第一个参数:automically
现在有这样的场景,第一次把字符串写入到文件中,当我们修改字符串之后,再次写入的时候,但是可能会写入失败但是之前的内容也有可能丢失,因为每次在写入新的内容的时候,会剪切之前的内容,所以这里就有可能新的没有写成功,旧的文件也丢失了所以这时候atomically参数:YES:会将新内容先写入到一个缓存文件中,如果写入缓存成功之后,这时候就将这个缓存文件替换旧文件,这样就很安全了

2NSData的内容读写
[objc]  view plaincopy 
1. //2.--------------------NSData读写  
2. //创建NSData的同时读取文件中的内容  
3. NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];  
4. //NSData转化成NSString  
5. NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
6. NSLog(@"%@",s);  
7.   
8. //写文件  
9. BOOL sucess1 = [data writeToFile:filePath atomically:YES];  
10. if(sucess1){  
11.     //写入成功  
12. }else{  
13.     //写入失败  
14. }

3NSArray的内容读写
[objc]  view plaincopy 
1. //3.--------------------NSArray读写文件  
2. NSArray *array = @[@"zhangsan",@"lisi"];  
3. //属性文件一般后缀名为.plist  
4. NSString *filePaths = [homePath stringByAppendingPathComponent:@"Documents/array.plist"];  
5. BOOL sucess2 = [array writeToFile:filePaths atomically:YES];  
6. if(sucess2){  
7.     //写入成功  
8. }else{  
9.     //写入失败  
10. }  
11. //读文件  
12. NSArray *arrays = [[NSArray alloc] initWithContentsOfFile:filePath];  
13. NSLog(@"%@",arrays);

4NSDirctionary的内容读写
[objc]  view plaincopy 
1. //4.---------------------NSDictionary读写文件  
2. NSDictionary *dic = @{@"zhang":@"zhangsan",@"li":@"lisi"};  
3. BOOL sucess3 = [dic writeToFile:filePath atomically:YES];  
4. if(sucess3){  
5.     //写入成功  
6. }else{  
7.     //写入失败  
8. }  
9.   
10. //读文件  
11. dic = [[NSDictionary alloc] initWithContentsOfFile:filePath];  
12. NSLog(@"%@",dic);  
上面说到的系统的info.plist文件就是NSDirctionary

三、在来看一下NSFileHandle的其他用法
[objc]  view plaincopy 
1. //  
2. //  main.m  
3. //  41_NSFileHandleTest  
4. //  
5. //  Created by jiangwei on 14-10-14.  
6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
7. //  
8.   
9. #import <UIKit/UIKit.h>  
10. #import "AppDelegate.h"  
11.   
12. //NSFileHandle是对文件内容进行读写  
13. int main(int argc, charchar * argv[]) {  
14.     @autoreleasepool {  
15.           
16.         //追加数据  
17.         NSString *str = @"无线互联";  
18.         NSString *homePath = NSHomeDirectory();  
19.         NSString *filePath = [homePath stringByAppendingPathComponent:@"file.test"];  
20.         [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];//写入文件  
21.           
22.         NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:filePath];  
23.         //默认是从开始位置写,所以我们需要将写入游标设置到尾部  
24.         //从文件的末尾写入  
25.         [handle seekToEndOfFile];  
26.         NSString *s = @"123";  
27.         NSData *data = [s dataUsingEncoding:NSUTF8StringEncoding];  
28.         [handle writeData:data];  
29.         //关闭文件  
30.         [handle closeFile];  
31.           
32.           
33.         //读取文件  
34.         NSFileHandle *handles = [NSFileHandle fileHandleForReadingAtPath:filePath];  
35.           
36.         //获取文件的大小  
37.         NSFileManager *fileManager = [NSFileManager defaultManager];  
38.         NSDictionary *fileAttr = [fileManager attributesOfItemAtPath:filePath error:nil];  
39.         NSNumber *fileSize = [fileAttr objectForKey:NSFileSize];  
40.         long long sizeValue = [fileSize longLongValue];  
41.           
42.         //设置偏移量  
43.         [handle seekToFileOffset:sizeValue/2];//将偏移量设置到中间位置  
44.         //从当前偏移量读到文件末尾  
45.         NSData *datas = [handle readDataToEndOfFile];  
46.         NSString *s2 = [[NSString alloc] initWithData:datas encoding:NSUTF8StringEncoding];  
47.         NSLog(@"%@",s2);  
48.           
49.         //一个汉字占用两个字节,有时候可能会将一个汉字分成两半,有乱码的问题,需要注意  
50.           
51.           
52.         //实现复制文件的功能  
53.         //使用NSFileHandle只能读写已经存在的文件,不能创建文件,创建文件应该使用NSFileManager  
54.         NSString *targetPath = [homePath stringByAppendingPathComponent:@"files.test"];  
55.         NSFileManager *fileManagers = [NSFileManager defaultManager];  
56.         [fileManagers createFileAtPath:targetPath contents:nil attributes:nil];  
57.           
58.         //创建读取文件的handle  
59.         NSFileHandle *readHandles = [NSFileHandle fileHandleForReadingAtPath:filePath];  
60.         //创建写文件的handle  
61.         NSFileHandle *writeHandles = [NSFileHandle fileHandleForWritingAtPath:targetPath];  
62.           
63.         //从当前偏移量读取到文件的末尾  
64.         NSData *datass = [readHandles readDataToEndOfFile];  
65.         //还有一种方式读取文件,既可以读取文件,也可以读流,功能更强  
66.         //[readHandles availableData];  
67.         [writeHandles writeData:datass];  
68.           
69.         //关闭文件  
70.         [readHandles closeFile];  
71.         [writeHandles closeFile];  
72.           
73.         //这里有问题,就是读取文件的时候全部读取了,这样会很占内存的,所以我们应该将读取内容进行分段  
74.           
75.           
76.           
77.                                  
78.         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));  
79.     }  
80. }

1、对原有的内容进行追加操作
[objc]  view plaincopy 
1. //追加数据  
2. NSString *str = @"无线互联";  
3. NSString *homePath = NSHomeDirectory();  
4. NSString *filePath = [homePath stringByAppendingPathComponent:@"file.test"];  
5. [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];//写入文件  
6.   
7. NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:filePath];  
8. //默认是从开始位置写,所以我们需要将写入游标设置到尾部  
9. //从文件的末尾写入  
10. [handle seekToEndOfFile];  
11. NSString *s = @"123";  
12. NSData *data = [s dataUsingEncoding:NSUTF8StringEncoding];  
13. [handle writeData:data];  
14. //关闭文件  
15. [handle closeFile];  
记得操作完之后,关闭文件,我们在追加文件的时候,只要在将当前游标移动到文件的末尾处即可,默认是在开始处

2、读取文件的任何位置内容
[objc]  view plaincopy 
1. //读取文件  
2. NSFileHandle *handles = [NSFileHandle fileHandleForReadingAtPath:filePath];  
3.   
4. //获取文件的大小  
5. NSFileManager *fileManager = [NSFileManager defaultManager];  
6. NSDictionary *fileAttr = [fileManager attributesOfItemAtPath:filePath error:nil];  
7. NSNumber *fileSize = [fileAttr objectForKey:NSFileSize];  
8. long long sizeValue = [fileSize longLongValue];  
9.   
10. //设置偏移量  
11. [handle seekToFileOffset:sizeValue/2];//将偏移量设置到中间位置  
12. //从当前偏移量读到文件末尾  
13. NSData *datas = [handle readDataToEndOfFile];  
14. NSString *s2 = [[NSString alloc] initWithData:datas encoding:NSUTF8StringEncoding];  
15. NSLog(@"%@",s2);  
还是设置一下游标的位置即可

3、实现文件的复制功能
[objc]  view plaincopy 
1. //实现复制文件的功能  
2. //使用NSFileHandle只能读写已经存在的文件,不能创建文件,创建文件应该使用NSFileManager  
3. NSString *targetPath = [homePath stringByAppendingPathComponent:@"files.test"];  
4. NSFileManager *fileManagers = [NSFileManager defaultManager];  
5. [fileManagers createFileAtPath:targetPath contents:nil attributes:nil];  
6.   
7. //创建读取文件的handle  
8. NSFileHandle *readHandles = [NSFileHandle fileHandleForReadingAtPath:filePath];  
9. //创建写文件的handle  
10. NSFileHandle *writeHandles = [NSFileHandle fileHandleForWritingAtPath:targetPath];  
11.   
12. //从当前偏移量读取到文件的末尾  
13. NSData *datass = [readHandles readDataToEndOfFile];  
14. //还有一种方式读取文件,既可以读取文件,也可以读流,功能更强  
15. //[readHandles availableData];  
16. [writeHandles writeData:datass];  
17.   
18. //关闭文件  
19. [readHandles closeFile];  
20. [writeHandles closeFile];  
21.   
22. //这里有问题,就是读取文件的时候全部读取了,这样会很占内存的,所以我们应该将读取内容进行分段  
这里的这种方式是:直接将源文件内容全部读取出来,然后写入到目标文件中,这样做有一个坏处,如果这个文件的内容太大,那么一次读取出那么多内容,内存会爆的,所以应该采用分段读取,这个就用到了上面说到的读取文件的任意位置的内容

总结

这一篇主要是介绍了文件的操作,对于文件的操作,后面的IOS开发过程中会经常用到,所以也是一个重点,当然还有一点需要说明的是,OC中的文件操作比Java中的文件操作方便多了。

OC中文件的操作的更多相关文章

  1. OC NSFileHandle(文件内容操作)

    OC NSFileHandle(文件内容操作) 初始化 [NSFileHandle fileHandleForUpdatingAtPath:@"data.txt"]; //file ...

  2. OC NSFileManager(文件路径操作)

    OC NSFileManager(文件路径操作) 初始化 NSFileManager * fm = [NSFileManager defaultManager]; 获取当前目录 [fm current ...

  3. Perl中文件读取操作

    Perl中文件读取操作 http://blog.csdn.net/yangxuan12580/article/details/51506216

  4. loadrunner中文件的操作

    loadrunner中文件的操作 我们可以使用fopen().fscanf().fprintf().fclose()函数进行文件操作,但是因为LoadRunner不支持FILE数据类型,所以我们需要做 ...

  5. Python中文件的操作

    文件的操作介绍 文件打开的方法 主要有两种: no with 格式:open(file, mode='r', buffering=-1, encoding=None, errors=None, new ...

  6. OC中文件读取类(NSFileHandle)介绍和常用使用方法

    NSFileHandle 1.NSFileManager类主要对于文件的操作(删除,修改,移动,赋值等等) //判断是否有 tagetPath 文件路径,没有就创建 NSFileManager *fi ...

  7. (C/C++学习)2.C语言中文件流操作基本函数总结

    函数所在头文件:stdio.h 说明:前半部分主要为对各个文件流操作函数的例举,后半部分着重于上机运行分析.文中部分引用自王桂林老师的C/C++课件. 1.FIELE *fopen(const cha ...

  8. c语言中文件相关操作

    一 .首先介绍一下数据文件的类型: 1.二进制文件(映像文件):在内存中以二进制形式存取. 2.文本文件(ascii文件):以ascii码形式存取的文件. 通俗的讲,在Mac下,你把一个文件丢进记事本 ...

  9. C++中文件流操作

    一.C++中流和流操作符 C++中把数据之间的传输操作称为流,流既可以表示数据从内存传送到某个载体或设备中,即输出流,也可以表示数据从某个载体或设备传送到内存缓冲区变量中,即输入流.C++输入输出除了 ...

随机推荐

  1. 深入了解 Flexbox 伸缩盒模型

    Flexbox(伸缩布局盒) 是 CSS3 中一个新的布局模式,为了现代网络中更为复杂的网页需求而设计.本文将介绍 Flexbox 语法的技术细节.浏览器的支持越来越快,所以当 Flexbox 被广泛 ...

  2. poj 3230 Travel(dp)

    Description One traveler travels among cities. He has to pay for this while he can get some incomes. ...

  3. 新闻公布系统 (Asp.net 三层架构 )

    2012年度课程设计---新闻公布系统(小结)                                                                             ...

  4. C++ STL源代码学习(map,set内部heap篇)

    stl_heap.h ///STL中使用的是大顶堆 /// Heap-manipulation functions: push_heap, pop_heap, make_heap, sort_heap ...

  5. How debuggers work

    做了一个PPT用来和组内的同学交流一下.内容很简单,写得也很简单. 谁知道博客园文章里怎么直接嵌入PPT呢? link: http://www.slideshare.net/ssuserdc412f/ ...

  6. 【网络流】【HDU3081】Marriage Match II

    得出正解前的思考: 1.我该如何处理朋友关系?消去朋友关系 ,直接由朋友关系得出情人关系的连线? 2.我该如何保证每次源点给1-N 平均分配1点流? 又可耻的看了题解,答案让我醍醐灌顶

  7. 关于XMLHttpRequest对象的responseText属性

      下面的代码是利用Ajax实现在输入框中写入一个ID号,即时的从数据库中取得数据并在页面无刷新的情况下显示. Ajax.aspx的代码: <%@ Page Language="C#& ...

  8. J2EE监听器和过滤器基础

    Servlet程序由Servlet,Filter和Listener组成,其中监听器用来监听Servlet容器上下文. 监听器通常分三类:基于Servlet上下文的ServletContex监听,基于会 ...

  9. iOS学习心得——UITableViewCell的复用

    UITableView是在iOS开发中最常用的控件之一.我的第一篇学习心得献给它了         UITableView是由一行一行的UITableViewCell构成的.         首先想这 ...

  10. 关于C#重写,隐藏的一些事

    第一次开始写技术博客,不知该从何处下手,本人算是菜鸟一枚,每每看到博客园里面的大牛们分享的技术文章,只能望其项背,高不可攀.但细细想来,若不尝试着从小处从低处慢慢去积累分享,想要成为技术大牛也只能沦为 ...