OC學習篇之---文件的操做 分類: IOS 2014-12-13 11:23 5128人閱讀 評論(4) 收藏

前一篇文章中咱們講到了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);

看一下運行結果:




第4、瞭解了程序的沙盒目錄,下面繼續來看一下操做文件的兩個類

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{
    //寫入失敗
}


三、NSArray的內容讀寫

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


四、NSDirctionary的內容讀寫

//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

3、在來看一下NSFileHandle的其餘用法

//
//  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中的文件操做方便多了。

相關文章
相關標籤/搜索