zoukankan      html  css  js  c++  java
  • NSFileHandle的用法(用于读写文件)

    利用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的文件中。

    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
        
            NSFileHandle *inFile, *outFile;
            NSData *buffer;
            //[[NSFileManager defaultManager] createFileAtPath:@"test.txt" contents:@"sdfjdsfdf" attributes:nil];
            
            //打开testfile.txt文件用于读取操作
            inFile = [NSFileHandle fileHandleForReadingAtPath:@"testfile.txt"];
            
            if(inFile == nil)
            {
                NSLog(@"Open of testfile.txt for reading failed!");
                return 1;
            }
            
            //创建一个文件用于写数据(第一次是必要的)
            [[NSFileManager defaultManager] createFileAtPath:@"testout.txt" contents:nil attributes:nil] ;
            
            //打开testout.txt文件用于写入操作
            outFile = [NSFileHandle fileHandleForWritingAtPath:@"testout.txt"];
            
            if(outFile == nil)
            {
                NSLog(@"Open of testout.txt for writing failed!");
                return 2;
            }

    代码分析:

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

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

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

    [databaseHandle seekToFileOffset:10];

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

    [databaseHandle seekToFileOffset:[databaseHandle offsetInFile] + 128];

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

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

    假如你想从文件的某个固定位置开始往下读取文件到末尾,可以编写如下代码:

    NSFileHandle *filepath = [NSFileHandle fileHandleForReadingAtPath:@"	ext.text"];
    [filepath seekToEndOfFile];
    [filepath seekToFileOffset:[filepath offsetInFile] -100 * sizeof(char)]; //这里假设从倒数第一百个字节开始读取文件
    NSData *data = [filepath readDataToEndOfFile];
    NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
  • 相关阅读:
    学习进度(第十四周)
    学习进度(第十三周)
    程序员修炼之道阅读笔记03
    程序员修炼之道阅读笔记02
    学习进度(第十二周)
    冲刺进度条10
    冲刺进度条09
    冲刺进度条08
    寒假学习进度报告2
    寒假学习进度报告1
  • 原文地址:https://www.cnblogs.com/mgbert/p/3554381.html
Copyright © 2011-2022 走看看