Objective-C使用NSFileHandle類對文件進行基本操作,IOS文件操作
NSFileHandle類中得方法可以對文件進行基本的讀寫,偏移量的操作。
NSFileHandle基本步驟:
1、打開文件,獲取一個NSFileHandle對象。
2、對打開NSFileHandle的文件對象行I/O操作
3、關閉文件對象
~~~
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,另外對于這兩個方法中文件的偏移量都是為文件的開始。
方法readDataToEndOfFile每次從文件中讀取最多UNIT_MAX字節的數據,這個量定義在
<limits.h>中。
在UNIX系統下編程打開文件進行寫入并不會截斷文件,需要自己完成截斷
~~~
1、實例程序,通過程序對文件進行一些基本操作:
~~~
#import <Foundation/Foundation.h>
int main(int argc, const charchar * argv[])
{
@autoreleasepool {
NSFileHandle *inFile,*outFile;
NSData *buffer;
NSString *fileContent = @"這些是文件內容,這些是文件內容,這些是文件內容,這些是文件內容,這些是文件內容";
NSFileManager *fm = [NSFileManager defaultManager];
//創建一個文件
[fm createFileAtPath:@"testFile.txt" contents:[fileContent dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
//創建一個需要寫入的文件
[fm createFileAtPath:@"outFile.txt" contents:nil attributes:nil];
//讀取文件
inFile = [NSFileHandle fileHandleForReadingAtPath:@"testFile.txt"];
//寫入文件
outFile = [NSFileHandle fileHandleForWritingAtPath:@"outFile.txt"];
if(inFile!=nil){
//讀取文件內容
buffer = [inFile readDataToEndOfFile];
//將文件的字節設置為0,因為他可能包含數據
[outFile truncateFileAtOffset:0];
//將讀取的內容內容寫到outFile.txt中
[outFile writeData:buffer];
//關閉輸出
[outFile closeFile];
//驗證outFile內容
NSLog(@"%@",[NSString stringWithContentsOfFile:@"outFile.txt" encoding:NSUTF8StringEncoding error:NULL]);
//創建一個新的文件用來循環寫入
[fm createFileAtPath:@"outFile2.txt" contents:nil attributes:nil];
//打開一個新的輸出
outFile = [NSFileHandle fileHandleForWritingAtPath:@"outFile2.txt"];
//設置一個循環寫入10條數據,每條數據都再后面添加上而不是覆蓋
for (int i = 0; i<10; i++) {
//將偏移量設置為文件的末尾
[outFile seekToEndOfFile];
//寫入數據
[outFile writeData:buffer];
}
//驗證內容
NSLog(@"outFile2:%@",[NSString stringWithContentsOfFile:@"outFile2.txt" encoding:NSUTF8StringEncoding error:NULL]);
//關閉所有
[outFile closeFile];
[inFile closeFile];
}
}
return 0;
}
~~~