前一篇文章中咱們講到了OC中的歸檔和解檔操做:http://blog.csdn.net/jiangwei0910410003/article/details/41872551,今天咱們來介紹OC中文件操做,在以前的文章中,已經接觸到了文件的建立了,可是那不是很具體和詳細,這篇文章咱們就來仔細看一下OC中是如何操做文件的:java
第1、首先來看一下自己NSString類給咱們提供了哪些能夠操做文件路徑名的方法編程
// // main.m // 37_FilePathHandle // // Created by jiangwei on 14-10-13. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //演示路徑 NSString *path = @"/Users/jiangwei/file.text"; //1.返回路徑的組成部分 NSArray *array = [path pathComponents]; NSLog(@"%@",array); //2.返回路徑最後組成部分 NSString *str = [path lastPathComponent]; NSLog(@"%@",str); //3.在原有的路徑後面追加子目錄 //這種方式有一點很差,就是須要添加/ [path stringByAppendingString:@"/appFile.text"]; //不須要添加/ [path stringByAppendingPathComponent:@"appFile.text"]; //4.刪除最後的組成部分 str = [path stringByDeletingLastPathComponent]; //刪除擴展名(.text被刪除了) str = [path stringByDeletingPathExtension]; //5.獲取擴展名 str = [path pathExtension]; //6.添加擴展名 [path stringByAppendingPathExtension:@".jpg"]; } return 0; }在Java中,咱們知道,當咱們去操做一個文件的時候,最開始的時候確定要去構建一個路徑,這個路徑通常都是String類型的,咱們須要定義不一樣的路徑和文件名,OC中也不例外,不過OC中的NSString類在這方面作的可能會更好,下面依次來看一下他的方法:
一、將路徑進行分割api
//演示路徑 NSString *path = @"/Users/jiangwei/file.text"; //1.返回路徑的組成部分 NSArray *array = [path pathComponents]; NSLog(@"%@",array);運行結果:
返回的一個數組,將路徑分割了,可是須要注意的是,第一個是"/",這個也算是路徑的一部分。數組
二、返回路徑的最後組成部分xcode
//2.返回路徑最後組成部分 NSString *str = [path lastPathComponent]; NSLog(@"%@",str);運行結果:
這個直接返回路徑的最後一部分,這個若是放在Java中,咱們可能須要用到String類的字符串分割技術了,沒有這裏的方便緩存
三、添加子目錄/子文件安全
//3.在原有的路徑後面追加子目錄 //這種方式有一點很差,就是須要添加/ //演示路徑 str = [path stringByAppendingString:@"/appFile.text"]; NSLog(@"%@",str); //不須要添加/ str = [path stringByAppendingPathComponent:@"appFile.text"]; NSLog(@"%@",str);這裏其實有兩種方式能夠添加,第一種是直接使用拼接字符串的方式,可是須要手動的添加"/",第二種方式是NSString提供的,不須要手動的添加"/"
運行結果:數據結構
四、刪除最後面的部分和後綴名app
//4.刪除最後的組成部分 str = [path stringByDeletingLastPathComponent]; NSLog(@"%@",str); //刪除擴展名(.text被刪除了) str = [path stringByDeletingPathExtension]; NSLog(@"%@",str);運行結果:
五、獲取擴展名字體
//5.獲取擴展名 str = [path pathExtension]; NSLog(@"%@",str);運行結果:
六、添加擴展名
//6.添加擴展名 str = [path stringByAppendingPathExtension:@"jpg"]; NSLog(@"%@",str);運行結果:
上面就是總結了NSString類中操做文件路徑的一些方法,其實這些操做若是放在Java中作的話,就是須要使用String的分割,拼接等技術了。這裏看到OC給咱們提供了便捷
第2、在來看一下操做文件以前須要瞭解的一個對象:NSData
這個類的做用就是將咱們寫入到文件中的數據進行編碼和解碼操做
// // main.m // 38_NSData // // Created by jiangwei on 14-10-13. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <Foundation/Foundation.h> //NSData類型 //是一種存儲形式 int main(int argc, const char * argv[]) { @autoreleasepool { //存儲是有編碼方式的,編程字節碼 //至關於Java中的解碼和編碼 NSString *s = @"tsdfsdfsdfsdf"; NSData *data = [s dataUsingEncoding:NSUTF8StringEncoding]; s = [[NSString alloc] initWithData:data encoding:(NSUTF8StringEncoding)]; //可變對象 NSMutableData 能夠追加數據 } return 0; }這個和Java中String直接在構造的時候就能夠進行編碼和解碼了,這裏須要使用中間類NSData,固然這個類是不可變的,若是想追加內容的話,須要使用NSMutableData類
第3、說完了NSData這個中間類,下面來正式說文件的操做了
可是這裏對文件的操做,咱們放到IOS平臺去操做,由於咱們後面也是會介紹IOS中文件的操做,因此就直接在這裏說了,固然這裏的知識會有點衝突,可是咱們不關心IOS中的其餘技術,只看他的文件操做:
一、沙盒文件
在IOS中,每一個應用程序都是一個沙盒,他們有本身的文件目錄,這個目錄對其餘程序是不可見的,和Android中的/data/data/包名/中的內容差很少,固然IOS中的沙盒目錄有三種:
Documents:存放長期使用的文件(通常存放目錄)
Library:系統存放文件
tmp:臨時文件,app重啓時,該目錄下得文件清空
下面來看一個簡單的例子吧:
// // main.m // 36_SandBoxFile // // Created by jiangwei on 14-10-13. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <UIKit/UIKit.h> #import "AppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { //獲取沙盒目錄 //默認有三個文件夾 //Documents:存放長期使用的文件(通常存放目錄) //Library:系統存放文件 //tmp:臨時文件,app重啓時,該目錄下得文件清空 //第一種獲取方式,咱們獲得Home目錄以後,手動的去拼接Document/Library NSString *homePath = NSHomeDirectory(); NSLog(@"沙盒目錄:%@",homePath); //第二種方式,直接使用Api獲取 //NSDocumentDirectory:Documents文件夾 //NSLibraryDirectory:Library文件夾 NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSLog(@"%@",array); NSArray *array1 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSLog(@"%@",array1); return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }建立IOS項目和OC差很少:
後續的操做就同樣了,建立完以後的項目結構:
咱們在main.m文件中寫咱們的代碼就能夠了。
下面來看代碼:
//第一種獲取方式,咱們獲得Home目錄以後,手動的去拼接Document/Library NSString *homePath = NSHomeDirectory(); NSLog(@"沙盒目錄:%@",homePath);獲取沙盒的home目錄,而後咱們能夠操做在其下面建立子目錄了
這裏有兩種方式去建立Document等目錄,一種是咱們用上面NSString類提供的方法去手動拼接目錄
還有一種是用系統給咱們提供的方法,這兩種都是能夠的
//第二種方式,直接使用Api獲取 //NSDocumentDirectory:Documents文件夾 //NSLibraryDirectory:Library文件夾 NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSLog(@"%@",array); NSArray *array1 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSLog(@"%@",array1);
1、NSFileManager
這個類的主要功能是對文件進行操做:建立,複製,剪切,刪除等
看代碼:
// // main.m // 39_NSFileManager // // Created by jiangwei on 14-10-13. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <UIKit/UIKit.h> #import "AppDelegate.h" //NSFileManager:對文件進行操做的,包括複製,粘貼,刪除,剪切等操做 int main(int argc, char * argv[]) { @autoreleasepool { //------------------建立文件/文件夾 //獲取沙盒目錄 NSString *homePath = NSHomeDirectory(); //在沙盒目錄中建立一個文件file.text NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"]; //NSFileManager是單利模式,因此不能使用alloc+init建立 NSFileManager *manager = [NSFileManager defaultManager]; NSString *str = @"無線互聯"; NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; //參數:文件路徑、文件內容、文件的屬性 BOOL sucess = [manager createFileAtPath:filePath contents:data attributes:nil]; if(sucess){ NSLog(@"文件建立成功"); }else{ NSLog(@"文件建立失敗"); } //建立文件夾 NSString *filePaths = [homePath stringByAppendingPathComponent:@"Documents/file"]; NSError *error; //須要傳遞一個建立失敗的指針對象,記錄建立失敗的信息 BOOL success1 = [manager createDirectoryAtPath:filePaths withIntermediateDirectories:YES attributes:nil error:&error]; if(!success1){ NSLog(@"建立成功"); }else{ NSLog(@"建立失敗"); } //--------------------讀取文件 //根據路徑讀取文件內容 NSData *datas = [manager contentsAtPath:filePath]; NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",s); //--------------------移動文件/剪切文件 //NSFileManager中沒有提供重命名的方法,因此咱們能夠藉助移動的api進行操做 //把filePath移動到targetPath目錄中 NSString *targetPath = [homePath stringByAppendingPathComponent:@"Documents/file/file2.text"]; BOOL sucess2 = [manager moveItemAtPath:filePath toPath:targetPath error:nil]; if(sucess2) { NSLog(@"移動成功"); }else{ NSLog(@"移動失敗"); } //--------------------複製文件 BOOL sucess3 = [manager copyItemAtPath:filePath toPath:targetPath error:nil]; if(sucess3){ //複製成功 }else{ //複製失敗 } //--------------------刪除文件 //刪除以前須要判斷這個文件是否存在 BOOL isExist = [manager fileExistsAtPath:filePath];//判斷文件是否存在 if(isExist){ BOOL sucess4 = [manager removeItemAtPath:filePath error:nil]; if(sucess4){ //刪除成功 }else{ //刪除失敗 } } //--------------------獲取文件的屬性 NSDictionary *dic = [manager attributesOfItemAtPath:filePath error:nil]; NSLog(@"%@",dic);//經過打印咱們就能夠查看文件屬性的一些key return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }
//------------------建立文件/文件夾 //獲取沙盒目錄 NSString *homePath = NSHomeDirectory(); //在沙盒目錄中建立一個文件file.text NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"]; //NSFileManager是單利模式,因此不能使用alloc+init建立 NSFileManager *manager = [NSFileManager defaultManager]; NSString *str = @"無線互聯"; NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; //參數:文件路徑、文件內容、文件的屬性 BOOL sucess = [manager createFileAtPath:filePath contents:data attributes:nil]; if(sucess){ NSLog(@"文件建立成功"); }else{ NSLog(@"文件建立失敗"); }NSFileManager內部使用了單例模式,這個後面會說到OC中得單例模式,而後就是構建一個NSData類,最後使用createFileAtPath方法建立文件,不過最後的attributes參數通常是用來給這個文件定義一些屬性的,固然文件自己也是有不少默認的屬性,好比文件的大小,文件的建立日期等,咱們也能夠本身在追加一些屬性。
二、建立文件夾
//建立文件夾 NSString *filePaths = [homePath stringByAppendingPathComponent:@"Documents/file"]; NSError *error; //須要傳遞一個建立失敗的指針對象,記錄建立失敗的信息 BOOL success1 = [manager createDirectoryAtPath:filePaths withIntermediateDirectories:YES attributes:nil error:&error]; if(!success1){ NSLog(@"建立成功"); }else{ NSLog(@"建立失敗"); }從這兩個操做看出來,他和Java中的File類很類似的
三、讀取文件
//--------------------讀取文件 //根據路徑讀取文件內容 NSData *datas = [manager contentsAtPath:filePath]; NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",s);
//--------------------移動文件/剪切文件 //NSFileManager中沒有提供重命名的方法,因此咱們能夠藉助移動的api進行操做 //把filePath移動到targetPath目錄中 NSString *targetPath = [homePath stringByAppendingPathComponent:@"Documents/file/file2.text"]; BOOL sucess2 = [manager moveItemAtPath:filePath toPath:targetPath error:nil]; if(sucess2) { NSLog(@"移動成功"); }else{ NSLog(@"移動失敗"); }這裏有兩個參數:一個是須要移動文件的路徑,和須要移動到哪的路徑
五、複製文件
//--------------------複製文件 BOOL sucess3 = [manager copyItemAtPath:filePath toPath:targetPath error:nil]; if(sucess3){ //複製成功 }else{ //複製失敗 }
//--------------------刪除文件 //刪除以前須要判斷這個文件是否存在 BOOL isExist = [manager fileExistsAtPath:filePath];//判斷文件是否存在 if(isExist){ BOOL sucess4 = [manager removeItemAtPath:filePath error:nil]; if(sucess4){ //刪除成功 }else{ //刪除失敗 } }
//--------------------獲取文件的屬性 NSDictionary *dic = [manager attributesOfItemAtPath:filePath error:nil]; NSLog(@"%@",dic);//經過打印咱們就能夠查看文件屬性的一些key屬性通常是NSDictionary
2、NSFileHandle
這個類主要是對文件進行讀寫操做的
看代碼:
// // main.m // 40_NSFileHandle // // Created by jiangwei on 14-10-13. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <UIKit/UIKit.h> #import "AppDelegate.h" //寫文件,咱們以前使用各類數據結構來存儲數據:NSString,NSData,NSDictionary,NSArray等,他們都是有一個writeToFile方法用來寫文件的 //純文本:沒有任何格式的數據 //非純文本:有修飾的數據(字體大小,字體顏色等) //數組只能將以下類型寫入文件,若是包含其餘對象,將寫入失敗:NSNumber,NSString,NSData,NSDate,NSArray,NSDictionary //數組、字典寫入的文件叫作屬性文件,可使用xcode進行編輯 int main(int argc, char * argv[]) { @autoreleasepool { //1.-------------------字符串讀寫文件 NSString *str = @"無線互聯"; NSString *homePath = NSHomeDirectory(); NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"]; //如今有這樣的場景,第一次把字符串寫入到文件中,當咱們修改字符串以後,再次寫入的時候,可是可能會寫入失敗 //可是以前的內容也有可能丟失,由於每次在寫入新的內容的時候,會剪切以前的內容,因此這裏就有可能新的沒有寫 //成功,舊的文件也丟失了 //因此這時候atomically參數: //YES:會將新內容先寫入到一個緩存文件中,若是寫入緩存成功以後,這時候就將這個緩存文件替換舊文件,這樣就很安全了 BOOL sucess = [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil]; if(sucess){ //寫入成功 }else{ //寫入失敗 } //讀取文件內容到字符串中 //類方法 NSString *str1 = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; //構造方法 //str1 = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; NSLog(@"%@",str1); //2.--------------------NSData讀寫 //建立NSData的同時讀取文件中的內容 NSData *data = [[NSData alloc] initWithContentsOfFile:filePath]; //NSData轉化成NSString NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",s); //寫文件 BOOL sucess1 = [data writeToFile:filePath atomically:YES]; if(sucess1){ //寫入成功 }else{ //寫入失敗 } //3.--------------------NSArray讀寫文件 NSArray *array = @[@"zhangsan",@"lisi"]; //屬性文件通常後綴名爲.plist NSString *filePaths = [homePath stringByAppendingPathComponent:@"Documents/array.plist"]; BOOL sucess2 = [array writeToFile:filePaths atomically:YES]; if(sucess2){ //寫入成功 }else{ //寫入失敗 } //讀文件 NSArray *arrays = [[NSArray alloc] initWithContentsOfFile:filePath]; NSLog(@"%@",arrays); //4.---------------------NSDictionary讀寫文件 NSDictionary *dic = @{@"zhang":@"zhangsan",@"li":@"lisi"}; BOOL sucess3 = [dic writeToFile:filePath atomically:YES]; if(sucess3){ //寫入成功 }else{ //寫入失敗 } //讀文件 dic = [[NSDictionary alloc] initWithContentsOfFile:filePath]; NSLog(@"%@",dic); return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }這個類就和Java中的FileInputStream/FileOutputStream相似了
其實咱們在以前看到歸檔和解檔操做的時候,那就是至關於寫文件和讀文件操做了。
一、字符串直接寫入文件
//1.-------------------字符串讀寫文件 NSString *str = @"無線互聯"; NSString *homePath = NSHomeDirectory(); NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"]; //如今有這樣的場景,第一次把字符串寫入到文件中,當咱們修改字符串以後,再次寫入的時候,可是可能會寫入失敗 //可是以前的內容也有可能丟失,由於每次在寫入新的內容的時候,會剪切以前的內容,因此這裏就有可能新的沒有寫 //成功,舊的文件也丟失了 //因此這時候atomically參數: //YES:會將新內容先寫入到一個緩存文件中,若是寫入緩存成功以後,這時候就將這個緩存文件替換舊文件,這樣就很安全了 BOOL sucess = [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil]; if(sucess){ //寫入成功 }else{ //寫入失敗 } //讀取文件內容到字符串中 //類方法 NSString *str1 = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; //構造方法 //str1 = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; 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:會將新內容先寫入到一個緩存文件中,若是寫入緩存成功以後,這時候就將這個緩存文件替換舊文件,這樣就很安全了
二、NSData的內容讀寫
//2.--------------------NSData讀寫 //建立NSData的同時讀取文件中的內容 NSData *data = [[NSData alloc] initWithContentsOfFile:filePath]; //NSData轉化成NSString NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",s); //寫文件 BOOL sucess1 = [data writeToFile:filePath atomically:YES]; if(sucess1){ //寫入成功 }else{ //寫入失敗 }
//3.--------------------NSArray讀寫文件 NSArray *array = @[@"zhangsan",@"lisi"]; //屬性文件通常後綴名爲.plist NSString *filePaths = [homePath stringByAppendingPathComponent:@"Documents/array.plist"]; BOOL sucess2 = [array writeToFile:filePaths atomically:YES]; if(sucess2){ //寫入成功 }else{ //寫入失敗 } //讀文件 NSArray *arrays = [[NSArray alloc] initWithContentsOfFile:filePath]; NSLog(@"%@",arrays);
//4.---------------------NSDictionary讀寫文件 NSDictionary *dic = @{@"zhang":@"zhangsan",@"li":@"lisi"}; BOOL sucess3 = [dic writeToFile:filePath atomically:YES]; if(sucess3){ //寫入成功 }else{ //寫入失敗 } //讀文件 dic = [[NSDictionary alloc] initWithContentsOfFile:filePath]; NSLog(@"%@",dic);上面說到的系統的info.plist文件就是NSDirctionary
// // main.m // 41_NSFileHandleTest // // Created by jiangwei on 14-10-14. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <UIKit/UIKit.h> #import "AppDelegate.h" //NSFileHandle是對文件內容進行讀寫 int main(int argc, char * argv[]) { @autoreleasepool { //追加數據 NSString *str = @"無線互聯"; NSString *homePath = NSHomeDirectory(); NSString *filePath = [homePath stringByAppendingPathComponent:@"file.test"]; [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];//寫入文件 NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:filePath]; //默認是從開始位置寫,因此咱們須要將寫入遊標設置到尾部 //從文件的末尾寫入 [handle seekToEndOfFile]; NSString *s = @"123"; NSData *data = [s dataUsingEncoding:NSUTF8StringEncoding]; [handle writeData:data]; //關閉文件 [handle closeFile]; //讀取文件 NSFileHandle *handles = [NSFileHandle fileHandleForReadingAtPath:filePath]; //獲取文件的大小 NSFileManager *fileManager = [NSFileManager defaultManager]; NSDictionary *fileAttr = [fileManager attributesOfItemAtPath:filePath error:nil]; NSNumber *fileSize = [fileAttr objectForKey:NSFileSize]; long long sizeValue = [fileSize longLongValue]; //設置偏移量 [handle seekToFileOffset:sizeValue/2];//將偏移量設置到中間位置 //從當前偏移量讀到文件末尾 NSData *datas = [handle readDataToEndOfFile]; NSString *s2 = [[NSString alloc] initWithData:datas encoding:NSUTF8StringEncoding]; NSLog(@"%@",s2); //一個漢字佔用兩個字節,有時候可能會將一個漢字分紅兩半,有亂碼的問題,須要注意 //實現複製文件的功能 //使用NSFileHandle只能讀寫已經存在的文件,不能建立文件,建立文件應該使用NSFileManager NSString *targetPath = [homePath stringByAppendingPathComponent:@"files.test"]; NSFileManager *fileManagers = [NSFileManager defaultManager]; [fileManagers createFileAtPath:targetPath contents:nil attributes:nil]; //建立讀取文件的handle NSFileHandle *readHandles = [NSFileHandle fileHandleForReadingAtPath:filePath]; //建立寫文件的handle NSFileHandle *writeHandles = [NSFileHandle fileHandleForWritingAtPath:targetPath]; //從當前偏移量讀取到文件的末尾 NSData *datass = [readHandles readDataToEndOfFile]; //還有一種方式讀取文件,既能夠讀取文件,也能夠讀流,功能更強 //[readHandles availableData]; [writeHandles writeData:datass]; //關閉文件 [readHandles closeFile]; [writeHandles closeFile]; //這裏有問題,就是讀取文件的時候所有讀取了,這樣會很佔內存的,因此咱們應該將讀取內容進行分段 return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }
//追加數據 NSString *str = @"無線互聯"; NSString *homePath = NSHomeDirectory(); NSString *filePath = [homePath stringByAppendingPathComponent:@"file.test"]; [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];//寫入文件 NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:filePath]; //默認是從開始位置寫,因此咱們須要將寫入遊標設置到尾部 //從文件的末尾寫入 [handle seekToEndOfFile]; NSString *s = @"123"; NSData *data = [s dataUsingEncoding:NSUTF8StringEncoding]; [handle writeData:data]; //關閉文件 [handle closeFile];記得操做完以後,關閉文件,咱們在追加文件的時候,只要在將當前遊標移動到文件的末尾處便可,默認是在開始處
二、讀取文件的任何位置內容
//讀取文件 NSFileHandle *handles = [NSFileHandle fileHandleForReadingAtPath:filePath]; //獲取文件的大小 NSFileManager *fileManager = [NSFileManager defaultManager]; NSDictionary *fileAttr = [fileManager attributesOfItemAtPath:filePath error:nil]; NSNumber *fileSize = [fileAttr objectForKey:NSFileSize]; long long sizeValue = [fileSize longLongValue]; //設置偏移量 [handle seekToFileOffset:sizeValue/2];//將偏移量設置到中間位置 //從當前偏移量讀到文件末尾 NSData *datas = [handle readDataToEndOfFile]; NSString *s2 = [[NSString alloc] initWithData:datas encoding:NSUTF8StringEncoding]; NSLog(@"%@",s2);仍是設置一下游標的位置便可
三、實現文件的複製功能
//實現複製文件的功能 //使用NSFileHandle只能讀寫已經存在的文件,不能建立文件,建立文件應該使用NSFileManager NSString *targetPath = [homePath stringByAppendingPathComponent:@"files.test"]; NSFileManager *fileManagers = [NSFileManager defaultManager]; [fileManagers createFileAtPath:targetPath contents:nil attributes:nil]; //建立讀取文件的handle NSFileHandle *readHandles = [NSFileHandle fileHandleForReadingAtPath:filePath]; //建立寫文件的handle NSFileHandle *writeHandles = [NSFileHandle fileHandleForWritingAtPath:targetPath]; //從當前偏移量讀取到文件的末尾 NSData *datass = [readHandles readDataToEndOfFile]; //還有一種方式讀取文件,既能夠讀取文件,也能夠讀流,功能更強 //[readHandles availableData]; [writeHandles writeData:datass]; //關閉文件 [readHandles closeFile]; [writeHandles closeFile]; //這裏有問題,就是讀取文件的時候所有讀取了,這樣會很佔內存的,因此咱們應該將讀取內容進行分段這裏的這種方式是:直接將源文件內容所有讀取出來,而後寫入到目標文件中,這樣作有一個壞處,若是這個文件的內容太大,那麼一次讀取出那麼多內容,內存會爆的,因此應該採用分段讀取,這個就用到了上面說到的讀取文件的任意位置的內容
總結
這一篇主要是介紹了文件的操做,對於文件的操做,後面的IOS開發過程當中會常常用到,因此也是一個重點,固然還有一點須要說明的是,OC中的文件操做比Java中的文件操做方便多了。