iOS开发之基础篇(7)—— NSFileHandle文件操作对象

版本

Xcode 8.2.1

前文介绍了NSFileManager文件管理器,今天来讲讲NSFileHandle文件操作对象。这两个有什么区别呢?

  • NSFileManager 此类主要是对文件进行的操作(移动、复制、修改、删除等)以及文件信息的获取
  • NSFileHandle 此类主要是对文件内容进行读取和写入操作

创建了NSFileHandle类和实例对象,我们先按command点击NSFileHandle这个类,看看它都有些什么方法。因为方法不太多,索性都列出来吧~

1、NSFileHandle类方法(+方法)

//打开Path对应文件准备读取,或者说打开读取权限。(返回该文件对应的NSFileHandle,以下+方法均同)
+(nullable instancetype)fileHandleForReadingAtPath:(NSString *)path;    
//打开Path对应文件准备写入
+(nullable instancetype)fileHandleForWritingAtPath:(NSString *)path;    
//打开Path对应文件准备更新
+(nullable instancetype)fileHandleForUpdatingAtPath:(NSString *)path;
//打开URL地址对应文件准备读取   
+(nullable instancetype)fileHandleForReadingFromURL:(NSURL *)url error:(NSError **)error;   
//打开URL地址对应文件准备写入
+(nullable instancetype)fileHandleForWritingToURL:(NSURL *)url error:(NSError **)error; 
//打开URL地址对应文件准备更新
+(nullable instancetype)fileHandleForUpdatingURL:(NSURL *)url error:(NSError **)error;

: (nullable instancetype)为Xcode 6.3的新特性nullability annotations,在这里表示这个对象可以是空对象。

2、NSFileHandle对象方法(-方法)

//读取文件所有数据,从游标(指针)位置(第一次读取在文件起始位置)读到文件末尾
- (NSData *)readDataToEndOfFile;
//从当前节点开始读取指定的长度数据
- (NSData *)readDataOfLength:(NSUInteger)length;
//从当前节点开始写入数据
- (void)writeData:(NSData *)data;

//移动游标到末尾
- (unsigned long long)seekToEndOfFile;
//移动游标到指定位置(offset偏移量)
- (void)seekToFileOffset:(unsigned long long)offset;

//将文件长度截取为offset字节。如多余,填空
- (void)truncateFileAtOffset:(unsigned long long)offset;
//同步文件
- (void)synchronizeFile;
//关闭文件
- (void)closeFile;

//通过文件描述符创建一个NSFileHandle对象
- (instancetype)initWithFileDescriptor:(int)fd closeOnDealloc:(BOOL)closeopt;
//使用解码器,将二进制数据流解码成NSFileHandle对象
- (nullable instancetype)initWithCoder:(NSCoder *)coder;

//在后台读取文件,完成后发出通知
- (void)readInBackgroundAndNotifyForModes:(nullable NSArray<NSRunLoopMode> *)modes;
//在当前线程操作完成同上动作
- (void)readInBackgroundAndNotify;

//与readInBackgroundAndNotifyForModes类似,读完
- (void)readToEndOfFileInBackgroundAndNotifyForModes:(nullable NSArray<NSRunLoopMode> *)modes;
//在当前线程操作完成同上动作
- (void)readToEndOfFileInBackgroundAndNotify;

//在后台接收连接,完成后通知
- (void)acceptConnectionInBackgroundAndNotifyForModes:(nullable NSArray<NSRunLoopMode> *)modes;
//单线程,同上
- (void)acceptConnectionInBackgroundAndNotify;


//后台写入数据到文件,完成后通知
- (void)waitForDataInBackgroundAndNotifyForModes:(nullable NSArray<NSRunLoopMode> *)modes;
//单线程,同上
- (void)waitForDataInBackgroundAndNotify;

3、NSFileHandle 示例

int main(int argc, char * argv[]) {

    //对文件的读写操作使用NSFilehandle
    //获取文件管理器
    NSFileManager *manager0 = [NSFileManager defaultManager];
    //实例化一个字符串
    NSString *fileStr = @"Hello world!";

    //转换为NSData对象
    NSData *fileData = [fileStr dataUsingEncoding:NSUTF8StringEncoding];

    //写入的文件路径
    NSString *filePath1 = @"/Users/tailor/Desktop/File.txt";

    //创建文件
    if(![manager0 fileExistsAtPath:filePath1]) {
        //参数1:文件路径
        //参数2:初始化的内容
        //参数3:附加信息,一般置为nil
        [manager0 createFileAtPath:
         filePath1
                          contents:fileData
                        attributes:nil];
    }

    //只读权限打开
    __unused NSFileHandle *readHandle = [NSFileHandle fileHandleForReadingAtPath:filePath1];
    //只写权限打开
    __unused NSFileHandle *writeHandle = [NSFileHandle fileHandleForWritingAtPath:filePath1];
    //读写权限打开
    NSFileHandle *updateHandle = [NSFileHandle fileHandleForUpdatingAtPath:filePath1];
    //读取文件,从游标(指针)位置(此时在文件起始位置)读到文件末尾
    NSData *readData = [updateHandle readDataToEndOfFile];
    //转化成为字符串
    NSLog(@"%@",[[NSString alloc]initWithData:readData encoding:NSUTF8StringEncoding]);

    //读取一段内容
    //更改游标位置至起始位置
    [updateHandle seekToFileOffset:0];
    NSData *readData1 = [updateHandle readDataOfLength:6];  //读取4个字符
    NSLog(@"%@",[[NSString alloc]initWithData:readData1 encoding:NSUTF8StringEncoding]);

    //移动游标到末尾
    [updateHandle seekToEndOfFile];
    //再写入一段内容
    [updateHandle writeData:fileData];

    //快速把字符串对象写入到本地,控制不了游标,只能全写或全读
    NSString *filePath2 = @"/Users/tailor/Desktop/String.txt";
    NSString *filePath3 = @"/Users/tailor/Desktop/Array.plist";
    NSString *filePath4 = @"/Users/tailor/Desktop/Dictionary.plist";

    //字符串
    NSString *plistStr = @"知行合一";
    //参数1:写入的文件路径
    //参数2:是否保证线程安全
    //参数3:编码格式
    //参数4:错误信息
    [plistStr writeToFile:filePath2
               atomically:YES
                 encoding:NSUTF8StringEncoding
                    error:nil];

    //数组
    NSArray *plistArr = @[@"one",@"two",@"three"];
    [plistArr writeToFile:filePath3 atomically:YES];

    //字典
    NSDictionary *pdic = @{@"one":@"1",@"two":@"2",@"three":@"3"};
    [pdic writeToFile:filePath4 atomically:YES];

    //快速读取本地文件转换成为字符串对象
    NSString *resultStr8 = [[NSString alloc]initWithContentsOfFile:filePath2 encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"%@",resultStr8);
    //快速读取本地文件转换成为数组
    NSLog(@"%@",[[NSArray alloc]initWithContentsOfFile:filePath3]);
    //从本地读取字典
    NSLog(@"%@",[[NSDictionary alloc]initWithContentsOfFile:filePath4]);
}

:__unused前缀,告诉编译器,如果变量未使用就不参与编译,免除不使用时发出警告。

控制台输出结果:

桌面:

image
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容