NSFilehandle

转载 2015年11月17日 18:16:26

利用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个字节,可以编写如下的消息表达式:

  1. [databaseHandle seekToFileOffset:10];  


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

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

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

  1. [databaseHandle seekToFileOffset:[databaseHandle offsetInFile] -5 * sizeof(int)];  

iOS疯狂详解之NSFileHandle

// 创建一个文件 - (void)addField { NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDo...
  • wangLongBlog
  • wangLongBlog
  • 2015年12月18日 10:56
  • 956

NSFileHandle拷贝大文件+多线程

//1、要分次读取,分次写入 //2、最后要刷新缓冲区 NSString *docpath = NSSearchPathForDirectoriesInDomains(NSDocu...
  • LonelyRun
  • LonelyRun
  • 2015年08月13日 22:35
  • 748

NSFileHandle的使用

NSFileHandle通过了处理文件 IO 的相关方法,通常来说,使用NSFileHandle的基本步骤如下:    1)创建一个NSFileHandle,该NSFileHandle将会打开指定的文...
  • longshihua
  • longshihua
  • 2016年01月20日 21:29
  • 981

NSFileHandle对文件管理的最详细介绍

一、在iOS开发中对于文件的管理非常重要。下面我们一起来探究一下 NSFileHandle 类是如何对文件管理的。 二、NSFileHandle类的方法介绍和使用,并加举例。 ...
  • zhoushuangjian511
  • zhoushuangjian511
  • 2017年03月27日 18:26
  • 479

iOS NSFileHandle详解

NSFileHandle 此类主要是对文件内容进行读取和写入操作 NSFileMange  此类主要是对文件进行的操作以及文件信息的获取 常用处理方法 + (id)fileHandleForRe...
  • HDFQQ188816190
  • HDFQQ188816190
  • 2016年10月09日 15:20
  • 1042

NSFileHandler---初步理解

NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[...
  • wsxzk123
  • wsxzk123
  • 2015年04月05日 00:55
  • 562

用NSFileHandle写文件,避免过大的内存开销

但项目往往需要将 用NSFileHandle写文件,避免过大的内存开销
  • yuanya
  • yuanya
  • 2014年10月25日 14:01
  • 663

ios-NSFileHandle和NSOutputStream

当我们一点一点的去下载的文件的时候,想要把文件保存起来就要用到这个类,因为如果我们直接用NSMutableData去拼接一点一点下载的文件的话,然后最后再一下子去写入,内存是会暴涨的,所以如果我们想解...
  • ZCMUCZX
  • ZCMUCZX
  • 2017年08月17日 11:43
  • 186

NSFileHandle简析以及实现超大文件的复制

1.NSFileHandle 主要函数介绍: @interface NSFileHandle : NSObject //NSFileHandle默认打开文件时,读写指针在文件开头. - (...
  • zhangjie121
  • zhangjie121
  • 2014年12月15日 15:51
  • 508

iOS NSFileHandle使用

NSFileHandle类是一个针对文件描述符的面向对象封装类。可以使用文件处理对象来访问与文件、sockets、管道pipes和设备相联系的数据。  对于文件,你可以在文件中读、写、查找。对于...
  • dqjyong
  • dqjyong
  • 2012年07月18日 13:42
  • 2870
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NSFilehandle
举报原因:
原因补充:

(最多只允许输入30个字)