利用NSFilehandle类提供的方法,允许更有效地使用文件。
一般而言,处理文件时都要经历以下三个步骤:
1.打开文件,并获取一个NSFileHandle对象,以便在后面的I/O操作中引用该文件
2.对打开的文件执行I/O操作(读取、写入、更新)
3.关闭文件
NSFileHandle用于以标准输入、标准输出、标准错误和空设置的方法。他们的格式为fileHandleWithDevice,其中Device可以是StandardInput、StandardOutput、StandardError或者NullDevice。
应该注意到,NSFileHandle类并没有提供创建文件的功能。必须使用NSFileManager方法来创建文件。因此,方法 fileHandleForWritingAtPath:和 hfileHandleUpdatingAtPath:都假定文件已经存在,否则返回nil。对于这两个方法,文件的偏移量都设为文件的开始,所以都是在文件的开始位置开始写入(或更新模式的读取)
NSFileHandle常用方法:
+(NSFileHandle*)fileHandleForReadingAtPath:path 打开一个文件用于读入
+(NSFileHandle*)fileHandleForWritingAtPath:path 打开一个文件用于写入
+(NSFileHandle*)fileHandleForUpdatingAtPath:path 打开一个文件用于读写
-(NSData*)availableData 从设备或者通道返回可用数据
-(NSData*)readDataToEndOfFile 读取其余的数据知道文件的末尾(最多UINT_MAX字节)
-(NSData*)readDataOfLength:(NSUInteger)bytes 从文件中读取指定字节的内容
-(void)writeData:data 将data写入文件
-(unsigned long long)offsetInFile 获取当前偏移量
-(void)seekToFileOffset:offset 设置偏移量
-(unsigned long long)seekToEndOfFile 将偏移量定位到文件的末尾
-(void)truncateFileAtOffset:offset 讲文件的长度设置为offset字节
-(void)closeFile 关闭文件
方法fileHandleForWritingAtPath和fileHandleForUpdatingAtPath所指定的文件必须是已经存在的,否则返回nil,另外对于这两个方法中文件的偏移量都是为文件的开始。
部分代码
NSFileHandle *inFile, *outFile;
NSData *buffer;
//文件 1
NSData *data = [NSData dataWithContentsOfFile:@"/Users/zxq/Desktop/userInfor"];
[[NSFileManager defaultManager] createFileAtPath:@"test.txt" contents:data attributes:nil];
//文件2
NSData *data2 = [NSData dataWithContentsOfFile:@"/Users/zxq/Desktop/123"];
[[NSFileManager defaultManager] createFileAtPath:@"out.txt" contents:data2 attributes:nil];
// 打开test.txt文件用于读取操作
inFile = [NSFileHandle fileHandleForReadingAtPath:@"test.txt"];
// 打开test.txt文件用于写操作
outFile = [NSFileHandle fileHandleForWritingAtPath: @"out.txt"];
outFile = [NSFileHandle fileHandleForUpdatingAtPath:@"out.txt"];
// 读取数据
buffer = [inFile readDataToEndOfFile];
buffer = [inFile readDataOfLength:60];
// 写入数据
[outFile writeData:buffer];
//获取当前文件的偏移量
long long offset = [outFile offsetInFile];
NSLog(@"offset = %lld", offset);
//设置当前文件的偏移量
[inFile seekToFileOffset:100];
if(inFile == nil)
{
NSLog(@"Open of testfile.txt for reading failed!");
return 1;
} else {
buffer = [inFile readDataToEndOfFile];
NSLog(@"%@", buffer);
}
//关闭两个文件
[inFile closeFile];
[outFile closeFile];
NSLog(@"%@", [NSString stringWithContentsOfFile:@"out.txt" encoding:NSUTF8StringEncoding error:nil]);