基本文件操作:NSFileHandle的用法

来源:互联网 发布:特殊名字生成器软件 编辑:程序博客网 时间:2024/04/27 01:11

利用NSFilehandle类提供的方法,允许更有效地使用文件。

一般而言,处理文件时都要经历以下三个步骤:

1.打开文件,并获取一个NSFileHandle对象,以便在后面的I/O操作中引用该文件

2.对打开的文件执行I/O操作(读取、写入、更新)

3.关闭文件

下面总结了一些常用的NSFileHandle的方法,在这个表中,fh是一个NSFileHandle对象,data是一个NSData对象,path是一个NSString 对象,offset是易额Unsigned long long变量。


上表中并为列出获取NSFileHandle以用于标准输入、标准输出、标准错误和空设置的方法。他们的格式为fileHandleWithDevice,其中Device可以是StandardInput、StandardOutput、StandardError或者NullDevice。

应该注意到,NSFileHandle类并没有提供创建文件的功能。必须使用NSFileManager方法来创建文件。因此,方法fileHandleForWritingAtPath:和hfileHandleUpdatingAtPath:都假定文件已经存在,否则返回nil。对于这两个方法,文件的偏移量都设为文件的开始,所以都是在文件的开始位置开始写入(或更新模式的读取)。另外,如果在UNIX系统下编程应该注意,打开用于读取的文件,不要截断文件;如果想要这么做,不得不自己完成这项操作。

下面的代码用于打开已经创建好的文件testfile文件,读取它的内容,并将其复制到名为testout的文件中。

[java] view plaincopy
  1. #import <Foundation/Foundation.h>  
  2.   
  3. int main(int argc, const char * argv[])  
  4. {  
  5.   
  6.     @autoreleasepool {  
  7.       
  8.         NSFileHandle *inFile, *outFile;  
  9.         NSData *buffer;  
  10.         //[[NSFileManager defaultManager] createFileAtPath:@"test.txt" contents:@"sdfjdsfdf" attributes:nil];  
  11.           
  12.         //打开testfile.txt文件用于读取操作  
  13.         inFile = [NSFileHandle fileHandleForReadingAtPath:@"testfile.txt"];  
  14.           
  15.         if(inFile == nil)  
  16.         {  
  17.             NSLog(@"Open of testfile.txt for reading failed!");  
  18.             return 1;  
  19.         }  
  20.           
  21.         //创建一个文件用于写数据(第一次是必要的)  
  22.         [[NSFileManager defaultManager] createFileAtPath:@"testout.txt" contents:nil attributes:nil] ;  
  23.           
  24.         //打开testout.txt文件用于写入操作  
  25.         outFile = [NSFileHandle fileHandleForWritingAtPath:@"testout.txt"];  
  26.           
  27.         if(outFile == nil)  
  28.         {  
  29.             NSLog(@"Open of testout.txt for writing failed!");  
  30.             return 2;  
  31.         }  
  32.           
  33.         //  
  34.         [outFile truncateFileAtOffset:0];  
  35.           
  36.         //从inFile中读取数据,并将其写入到outFile中  
  37.         buffer = [inFile readDataToEndOfFile];  
  38.           
  39.         [outFile writeData:buffer];  
  40.           
  41.         //关闭两个文件  
  42.         [inFile closeFile];  
  43.         [outFile closeFile];  
  44.           
  45.         //验证文件的内容是否写入  
  46.         NSLog(@"%@",[NSString stringWithContentsOfFile:@"testout.txt" encoding:NSUTF8StringEncoding error:nil]);  
  47.     }  
  48.     return 0;  
  49. }  

代码分析:

方法readDataToEndOfFile:每次从文件中读取最多UINT_MAX个字节的数据,这个量定义在头文件<limits.h>中,并且在许多系统中值等于FFFFFFFF(16进制)。这个值对于你h编写的任何应用程序而言,已经足够大了。还可以中断这项操作,以执行少量读取和写入。利用方法readDataOfLength:甚至可以设置循环,一次在文件之间传输一缓冲区的字节。缓冲区的大小可能是8192(8Kb)字节,也可以是131072(128Kb)字节。经常使用的是2的乘方,这是因为底层操作系统通常是以块为单位执行I/O操作的,而块的大小一般为2的乘方个字节。可能要在系统上试用不同的值,以查看那个值最合适。

如果读取方法到大文件的末尾,并且没有读到任何数据那么这个方法将返回一个空的NSData对象(也就是说,缓冲区中没有字节)。可以对这个缓冲区应用length方法,并测试长度是否等于0,以查看该文件中是否还剩有数据可以读取。

如果打开一个要更新的文件,则文件的偏移量要被设置为文件的开始。通过在文件中定位(seeking),可以更改偏移量,然后执行该文件的读写操作。因此,要定位到文件 (文件的句柄为databaseHandle)的第10个字节,可以编写如下的消息表达式:

[cpp] view plaincopy
  1. [databaseHandle seekToFileOffset:10];  


通过获得当前的文件偏移量,然后加上或者减去这个值,就得到相对文件位置。因此,要跳过文件中当前位置之后的128个字节,编写如下代码:

[csharp] view plaincopy
  1. [databaseHandle seekToFileOffset:[databaseHandle offsetInFile] + 128];  

要在文件中向回移动5个整数所占的子结束,编写如下代码:

[cpp] view plaincopy
  1. [databaseHandle seekToFileOffset:[databaseHandle offsetInFile] -5 * sizeof(int)];  
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 国考英语准考证名字错了怎么办 玻尿酸打鼻子双眼间距好怪怎么办 喝咖啡后胃不舒服想吐怎么办 分期付款买的车不想还款了怎么办 考试时打小抄被同学发现怎么办 生完二胎计生办强制要求上环怎么办 没办二代身份证户口被注销怎么办 川航特价儿童票名字写错怎么办 川航机票名字错一个字怎么办 买飞机票名字打错了一个字怎么办 坐飞机耳朵聋了下飞机还痛怎么办 小孩咳嗽两个月了还不好怎么办 生完小孩肚子瘦不下来怎么办 胆子小一个人在家里都害怕怎么办 怀了双胞胎两个宝宝很挤怎么办 飞机无人陪护如果接机延误该怎么办 过年要坐火车回家 狗狗怎么办 一岁八个月宝宝小腿弯怎么办 2岁宝不愿意坐马桶拉屎怎么办 宝宝两岁多肺炎出院还老咳嗽怎么办 去外国机场买机票不会说外语怎么办 坐飞机不能带的物品办理托运怎么办 深圳外地户口儿童要办身份证怎么办 网上订票错写了护照号怎么办 国航 在智能火车票订飞机票订反了怎么办 办社保卡的时候填错地址怎么办 两个人住酒店只有一张身份证怎么办 农村社保卡信息错了说改不了怎么办 社保卡与原医保卡信息错误怎么办 学校发的社保卡丢了怎么办 魔棒工具选中选区后再怎么办 微信每次打开都出现月球图案怎么办 仙人掌的刺扎手里弄不出来怎么办 保险交满15年领了一年死了怎么办 狗咬了出了点血怎么办 被小狗咬到了吃了海鲜怎么办 想给一个人道歉又不敢说怎么办 被尘封的故事中魔法师不见了怎么办 宝骏5602挡升3挡有点卡怎么办 剥开的榴莲没熟壳又扔了怎么办 视频播放器激活码设备超限了怎么办