基本文件操作filehandle的用法

利用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]);