/*
文件处理句柄要完成的工作: 相当于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];
}