NSFileHandle

/*

 文件处理句柄要完成的工作相当于C中的文件操作,诸如 打开,读,写,关闭,修改文件偏移量等行为

 

   类名:   NSFileHandle

 

    注意: 操作句柄时,重点把握文件的偏移量在哪个位置

        

    重点方法:

             1,类方法创建句柄  fileHandleForXXX  可读,可写,读写

 

             2, 读句柄,readXXX   

             3, 写句柄,writeXXX

             4, 修改偏移量: seekXXX

             5, 获取偏移量:  offsetXXX

             6, 最后要将句柄关闭, closeFile

 */

 #define PATH @"/Users/wenhua/Desktop/text.txt"

// text.txt内容为:1234567890abcdefghijklmnopqrstuvwxyz

void readFileByHandle(void)

{

    //新建一个文件句柄对象

//    NSFileHandle * fh = [[NSFileHandle alloc]init];

    

    // 打开一个文件,生成一个句柄对应c中的 fopen “r”

    NSFileHandle *fh = [NSFileHandle fileHandleForReadingAtPath:PATH];

    

    //  读文件,读10个字节, 对应c中的, fread

    NSData* data = [fh readDataOfLength:10];

    NSLog(@"%@", [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);//1234567890

 

    //第二次读

    NSData *data2 = [fh readDataOfLength:10];

    NSLog(@"第二次读:%@",[[NSString alloc]initWithData:data2 encoding:NSUTF8StringEncoding]);// abcdefghij

 

    //从当前偏移量开始读到文件末尾

    NSData* dataEnd = [fh readDataToEndOfFile];

    NSLog(@"读到文件末尾:%@",[[NSString alloc]initWithData:dataEnd  encoding:NSUTF8StringEncoding]);

        

    //修改文件偏移量,对应c中的 fseek

    [fh seekToFileOffset:0];

    //第三次读

    NSData *data3 = [fh readDataOfLength:10];

    NSLog(@"在修改文件偏移量之后,再读:%@",[[NSString alloc]initWithData:data3 encoding:NSUTF8StringEncoding]);

    

    //将文件偏移量置到文件末尾

    [fh seekToEndOfFile];

    //第四次读

    NSData *data4 = [fh readDataOfLength:10];

    NSLog(@"将文件偏移量置到文件末尾,再读:%@",[[NSString alloc]initWithData:data4 encoding:NSUTF8StringEncoding]);

    

    

 

    // 关闭文件句柄  对应c中的 fclose

    [fh closeFile];

    

    

}

 

 

void writeFileByHandle(void)

{

    //写打开一个文件,只能写,不能读 fopen "w"

    NSFileHandle * fh = [ NSFileHandle fileHandleForWritingAtPath:PATH];

    

    //将文件偏移量置到末尾,防止覆盖以前的内容

    [fh seekToEndOfFile];

    

    //写文件 fwrite

    [fh writeData:[@"wenhua" dataUsingEncoding:NSUTF8StringEncoding]];

    

    //在只写打开的情况下不能读句柄

//    NSData* data = [fh readDataToEndOfFile];

//    NSLog(@"data:%@",data);

    [fh closeFile];

    

}

 

void rwFileByHandle(void)

{

    //可读可写打开  fopen "a"

    NSFileHandle *fh = [ NSFileHandle fileHandleForUpdatingAtPath:PATH];

    

    NSLog(@"可读可写打开后,默认偏移量为:%llu", [fh offsetInFile]);// 0

    //全部读完

    NSData* data=[fh readDataToEndOfFile];

    NSLog(@"data:%@", [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);

    //查看偏移量

    NSLog(@"全部读完之后,偏移量为:%llu",[fh offsetInFile]);

    

    //写文件

    [fh writeData:[@"66666666666666666" dataUsingEncoding:NSUTF8StringEncoding ]];

    //查看偏移量

    NSLog(@"全部读完之后,偏移量为:%llu",[fh offsetInFile]);

    [fh seekToFileOffset:0];

    NSData* data2 =[fh readDataToEndOfFile];

    NSLog(@"写完66666之后,再读:data2:%@",[[NSString alloc]initWithData:data2 encoding:NSUTF8StringEncoding]);

    [fh closeFile];

}

原文地址:https://www.cnblogs.com/hyuganatsu/p/NSFileHandle.html