关于NSFileHandle相见恨晚的一些故事

先说说最近的工作状态:上个月的今天完婚,日子过的真快,转眼一个月过去了。上个月国庆加婚假一直休了十七八天,突然觉得不上班儿也挺累的。最近两天觉得工作状态渐入佳境,工作效率明显提高,假期这个东西,时间太久不休息会累的不行,休的时间长了疲倦的要好久才能缓过劲来。
ok,还是说说NSFileHandle。这个东东是直接以二进制的形式操作文件的,对应C的file(或者fopen?),也支持直接定位,直接读写操作文件。说实话真有点儿相见恨晚的感觉。之前的时候显示txt文件,直接扔给webview了,文件小了还好说,文件一大,半天显示不出来文件;再之前文件大管家的蓝牙传输功能,接收方直接把接收的数据搁在内存里,然后收完了一并写到硬盘上,在iOS设备上,文件大小一M基本就对应一M内存,在这寸土寸金的地儿,往内存里塞文件,真是件奢侈的事儿。其实回头想想也没办法,当你粗鲍简单能把问题解决的时候,你是不会再浪费时间去探索更优的解决办法的。当然,懒只是一方面,主要是因为没有时间,因为只要你想做,你总能找出来最优的文案。
ok,还是不知者不怪吧,以前用到NSFileHandle的时候,都是跟NSTask配合,简单以为这个函数就是用来通过管道的形式跟其它进程交互呢,而且我肿么也不会想到这个函数可以在iOS上用(因为NSTask只能在OSX上用嘛),思维定式害死人,列一下有用的语法吧:

//打开文件
+ (id)fileHandleForReadingAtPath:(NSString *)path; //以读的形式打开文件
+ (id)fileHandleForWritingAtPath:(NSString *)path; //以写的形式打开文件
+ (id)fileHandleForUpdatingAtPath:(NSString *)path;//以读写的形式打开文件

//获取数据
- (NSData *)readDataToEndOfFile; //从当前位置读到文件尾
- (NSData *)readDataOfLength:(NSUInteger)length; //一次读取多少个字节,很酷哟

//写入数据
- (void)writeData:(NSData *)data; //向文件写入数据,打开时要用写权限哟

//文件定位相关
- (unsigned long long)offsetInFile; //获取当前在文件中的五凤楼
- (unsigned long long)seekToEndOfFile; //获取文件长度,要注意的是这样指针也指向文件尾了哟
- (void)seekToFileOffset:(unsigned long long)offset; //在文件中移动指针

- (void)truncateFileAtOffset:(unsigned long long)offset; //把当前位置往后的数据抹掉,速度很快的哟。

//关闭文件
- (void)closeFile; //关闭文件,好借好还再借不难

以上的解释,或多或少都有C的风格,虽然没用C实际写过啥东东,但是起码学过,这些基本的东东还有印象。在使用的过程中,唯一觉得遗憾的就是没有truncateFileToOffset这样的函数,为什么可以从当前文件抹除数据在文件尾,不能从文件头,抹除数据到当前位置呢?

    分享到:

About rainbird

IOS攻城狮
This entry was posted in IOS开发, Mac开发, object-c, xCode and tagged , , , , , , , , , , , . Bookmark the permalink.

发表评论