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

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

  1. //
  2. //  main.m
  3. //  37_FilePathHandle
  4. //
  5. //  Created by jiangwei on 14-10-13.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. int main(int argc, const charchar * argv[]) {
  10. @autoreleasepool {
  11. //演示路径
  12. NSString *path = @"/Users/jiangwei/file.text";
  13. //1.返回路径的组成部分
  14. NSArray *array = [path pathComponents];
  15. NSLog(@"%@",array);
  16. //2.返回路径最后组成部分
  17. NSString *str = [path lastPathComponent];
  18. NSLog(@"%@",str);
  19. //3.在原有的路径后面追加子目录
  20. //这种方式有一点不好,就是需要添加/
  21. [path stringByAppendingString:@"/appFile.text"];
  22. //不需要添加/
  23. [path stringByAppendingPathComponent:@"appFile.text"];
  24. //4.删除最后的组成部分
  25. str = [path stringByDeletingLastPathComponent];
  26. //删除扩展名(.text被删除了)
  27. str = [path stringByDeletingPathExtension];
  28. //5.获取扩展名
  29. str = [path pathExtension];
  30. //6.添加扩展名
  31. [path stringByAppendingPathExtension:@".jpg"];
  32. }
  33. return 0;
  34. }

在Java中,我们知道,当我们去操作一个文件的时候,最开始的时候肯定要去构建一个路径,这个路径一般都是String类型的,我们需要定义不同的路径和文件名,OC中也不例外,不过OC中的NSString类在这方面做的可能会更好,下面依次来看一下他的方法:

1、将路径进行分割

  1. //演示路径
  2. NSString *path = @"/Users/jiangwei/file.text";
  3. //1.返回路径的组成部分
  4. NSArray *array = [path pathComponents];
  5. NSLog(@"%@",array);

运行结果:

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

2、返回路径的最后组成部分

  1. //2.返回路径最后组成部分
  2. NSString *str = [path lastPathComponent];
  3. NSLog(@"%@",str);

运行结果:

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

3、添加子目录/子文件

  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、删除最后面的部分和后缀名

  1. //4.删除最后的组成部分
  2. str = [path stringByDeletingLastPathComponent];
  3. NSLog(@"%@",str);
  4. //删除扩展名(.text被删除了)
  5. str = [path stringByDeletingPathExtension];
  6. NSLog(@"%@",str);

运行结果:

5、获取扩展名

  1. //5.获取扩展名
  2. str = [path pathExtension];
  3. NSLog(@"%@",str);

运行结果:

6、添加扩展名

  1. //6.添加扩展名
  2. str = [path stringByAppendingPathExtension:@"jpg"];
  3. NSLog(@"%@",str);

运行结果:

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

第二、在来看一下操作文件之前需要了解的一个对象:NSData

这个类的作用就是将我们写入到文件中的数据进行编码和解码操作

  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. #import <Foundation/Foundation.h>
  9. //NSData类型
  10. //是一种存储形式
  11. int main(int argc, const charchar * argv[]) {
  12. @autoreleasepool {
  13. //存储是有编码方式的,编程字节码
  14. //相当于Java中的解码和编码
  15. NSString *s = @"tsdfsdfsdfsdf";
  16. NSData *data = [s dataUsingEncoding:NSUTF8StringEncoding];
  17. s = [[NSString alloc] initWithData:data encoding:(NSUTF8StringEncoding)];
  18. //可变对象 NSMutableData 可以追加数据
  19. }
  20. return 0;
  21. }

这个和Java中String直接在构造的时候就可以进行编码和解码了,这里需要使用中间类NSData,当然这个类是不可变的,如果想追加内容的话,需要使用NSMutableData类

第三、说完了NSData这个中间类,下面来正式说文件的操作了

但是这里对文件的操作,我们放到iOS平台去操作,因为我们后面也是会介绍IOS中文件的操作,所以就直接在这里说了,当然这里的知识会有点冲突,但是我们不关心IOS中的其他技术,只看他的文件操作:

1、沙盒文件

在IOS中,每个应用程序都是一个沙盒,他们有自己的文件目录,这个目录对其他程序是不可见的,和Android中的/data/data/包名/中的内容差不多,当然IOS中的沙盒目录有三种:

Documents:存放长期使用的文件(一般存放目录)

Library:系统存放文件

tmp:临时文件,app重启时,该目录下得文件清空

下面来看一个简单的例子吧:

  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. #import <UIKit/UIKit.h>
  9. #import "AppDelegate.h"
  10. int main(int argc, charchar * argv[]) {
  11. @autoreleasepool {
  12. //获取沙盒目录
  13. //默认有三个文件夹
  14. //Documents:存放长期使用的文件(一般存放目录)
  15. //Library:系统存放文件
  16. //tmp:临时文件,app重启时,该目录下得文件清空
  17. //第一种获取方式,我们得到Home目录之后,手动的去拼接Document/Library
  18. NSString *homePath = NSHomeDirectory();
  19. NSLog(@"沙盒目录:%@",homePath);
  20. //第二种方式,直接使用Api获取
  21. //NSDocumentDirectory:Documents文件夹
  22. //NSLibraryDirectory:Library文件夹
  23. NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  24. NSLog(@"%@",array);
  25. NSArray *array1 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
  26. NSLog(@"%@",array1);
  27. return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  28. }
  29. }

创建IOS项目和OC差不多:

后续的操作就一样了,创建完之后的项目结构:

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

下面来看代码:

  1. //第一种获取方式,我们得到Home目录之后,手动的去拼接Document/Library
  2. NSString *homePath = NSHomeDirectory();
  3. NSLog(@"沙盒目录:%@",homePath);

获取沙盒的home目录,然后我们可以操作在其下面创建子目录了

这里有两种方式去创建Document等目录,一种是我们用上面NSString类提供的方法去手动拼接目录

还有一种是用系统给我们提供的方法,这两种都是可以的

  1. //第二种方式,直接使用Api获取
  2. //NSDocumentDirectory:Documents文件夹
  3. //NSLibraryDirectory:Library文件夹
  4. NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  5. NSLog(@"%@",array);
  6. NSArray *array1 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
  7. NSLog(@"%@",array1);

看一下运行结果:

第四、了解了程序的沙盒目录,下面继续来看一下操作文件的两个类

一、NSFileManager

这个类的主要功能是对文件进行操作:创建,复制,剪切,删除等

看代码:

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

1、创建文件

  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、创建文件夹

  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、读取文件

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

4、剪切文件

  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、复制文件

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

6、删除文件

  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、操作文件的属性

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

属性一般是NSDictionary

二、NSFileHandle

这个类主要是对文件进行读写操作的

看代码:

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

这个类就和Java中的FileInputStream/FileOutputStream类似了

其实我们在之前看到归档和解档操作的时候,那就是相当于写文件和读文件操作了。

1、字符串直接写入文件

  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:会将新内容先写入到一个缓存文件中,如果写入缓存成功之后,这时候就将这个缓存文件替换旧文件,这样就很安全了

2、NSData的内容读写

  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. BOOL sucess1 = [data writeToFile:filePath atomically:YES];
  9. if(sucess1){
  10. //写入成功
  11. }else{
  12. //写入失败
  13. }

3、NSArray的内容读写

  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);

4、NSDirctionary的内容读写

  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. dic = [[NSDictionary alloc] initWithContentsOfFile:filePath];
  11. NSLog(@"%@",dic);

上面说到的系统的info.plist文件就是NSDirctionary

三、在来看一下NSFileHandle的其他用法

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

1、对原有的内容进行追加操作

  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. NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:filePath];
  7. //默认是从开始位置写,所以我们需要将写入游标设置到尾部
  8. //从文件的末尾写入
  9. [handle seekToEndOfFile];
  10. NSString *s = @"123";
  11. NSData *data = [s dataUsingEncoding:NSUTF8StringEncoding];
  12. [handle writeData:data];
  13. //关闭文件
  14. [handle closeFile];

记得操作完之后,关闭文件,我们在追加文件的时候,只要在将当前游标移动到文件的末尾处即可,默认是在开始处

2、读取文件的任何位置内容

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

还是设置一下游标的位置即可

3、实现文件的复制功能

  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. //创建读取文件的handle
  7. NSFileHandle *readHandles = [NSFileHandle fileHandleForReadingAtPath:filePath];
  8. //创建写文件的handle
  9. NSFileHandle *writeHandles = [NSFileHandle fileHandleForWritingAtPath:targetPath];
  10. //从当前偏移量读取到文件的末尾
  11. NSData *datass = [readHandles readDataToEndOfFile];
  12. //还有一种方式读取文件,既可以读取文件,也可以读流,功能更强
  13. //[readHandles availableData];
  14. [writeHandles writeData:datass];
  15. //关闭文件
  16. [readHandles closeFile];
  17. [writeHandles closeFile];
  18. //这里有问题,就是读取文件的时候全部读取了,这样会很占内存的,所以我们应该将读取内容进行分段

这里的这种方式是:直接将源文件内容全部读取出来,然后写入到目标文件中,这样做有一个坏处,如果这个文件的内容太大,那么一次读取出那么多内容,内存会爆的,所以应该采用分段读取,这个就用到了上面说到的读取文件的任意位置的内容

总结

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

OC学习篇之---文件的操作的更多相关文章

  1. OC学习篇之---总结和学习目录

    今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生 ...

  2. OC学习篇之---单例模式

    在之前的一片文章中介绍了对象的拷贝相关知识:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天我们来看一下OC中的单 ...

  3. (转载)OC学习篇之---概述

    前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲 ...

  4. 树莓派学习笔记——使用文件IO操作GPIO SysFs方式

    0 前言     本文描写叙述假设通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先訪问/sys/class/gpio文件夹,向export文件写入GPIO编号, ...

  5. linux学习笔记一----------文件相关操作

    一.目录结构 二.文件管理操作命令(有关文件夹操作,使用Tab键自动补全文件名(如果多个默认第一个)) 1.ls 查看目录信息:ls -l 查看目录详细信息(等价于ll 某些系统不支持) 2.pwd ...

  6. python 的基础学习 第九天 文件的操作

    1,文件操作 参数:1,文件路径  2,编码方式,3,执行动作(打开方式),只读,只写,,读写,追加和读写. 1  打开文件,得到文件句柄并赋值给一个变量.2. 通过句柄对文件进行操作.3. 关闭文件 ...

  7. 《转》Python学习(15)-对文件的操作(二)

    转自 http://www.cnblogs.com/BeginMan/p/3169020.html 一.文件系统 从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件存储并对存入的文件进 ...

  8. 记录我的 python 学习历程-Day08 文件的操作

    文件操作的初识 用 python 代码对文件进行各种操作. 基本构成: 文件路径:path 打开方式:读.写.追加.读写.写读-- 编码方式:utf-8 / gbk / gb2312-- f = op ...

  9. OC学习篇之---KVC和KVO操作

    前一篇文章我们介绍了OC中最常用的文件操作:http://blog.csdn.net/jiangwei0910410003/article/details/41875015,那么今天来看一下OC中的一 ...

随机推荐

  1. CRSF Defense Using Content Injection Support By ModSecurity

    The most advanced and imaginative use of the content injection feature is that devised byRyan C. Bar ...

  2. js函数的属性和方法

    js函数的属性和方法 前面的话 函数是javascript中特殊的对象,可以拥有属性和方法,就像普通的对象拥有属性和方法一样.甚至可以用Function()构造函数来创建新的函数对象.本文是深入理解j ...

  3. 54.nodejs nodemailer不兼容

    转自:https://blog.csdn.net/q36835109/article/details/53067917 注:由于本人使用最新版本的nodemailer不兼容,所以目前使用的是0.7.1 ...

  4. hadoop集群环境配置成功与否查看方法

    1.Hadoop启动jobhistoryserver来实现web查看作业的历史运行情况,由于在启动hdfs和Yarn进程之后,jobhistoryserver进程并没有启动,需要手动启动jobhist ...

  5. c# array arraylist 泛型list

    1 array 数组  是存储相同类型元素的固定大小的数据的顺序集合.在内存中是连续存储的,所以索引速度非常快,而且赋值和修改元素也非常简单. //定义字符串数组 大小为3 string[] str1 ...

  6. 【习题 8-9 1613】 K-Graph Oddity

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 感觉最大度数|1就是最多需要的个数了. 就贪心一下. 然后模拟染色的过程就可以了. (贪心染色就可以了 (看看周围哪个颜色没有,就用 ...

  7. start_kernel----lcokdep_init

    void lockdep_init(void) { int i; /* * Some architectures have their own start_kernel() * code which ...

  8. bootstrap之Orientation

    Orientation 调整屏幕方向的操作. package io.appium.android.bootstrap.handler; import android.os.RemoteExceptio ...

  9. 快速排序的期望复杂度O(nlogn)证明。

    快速排序的最优时间复杂度是 \(O(nlogn)\),最差时间复杂度是 \(O(n^2)\),期望时间复杂度是 \(O(nlogn)\). 这里我们证明一下快排的期望时间复杂度. 设 \(T(n)\) ...

  10. 8 Great Java 8 Features No One's Talking about--转载

    原文地址:http://www.infoq.com/articles/Java-8-Quiet-Features If you haven’t seen some of the videos or t ...