iOS文件输出输入流
2018-04-27 本文已影响220人
白屏
注:大文件上传或者下载,如果一次性加载数据到内存,会导致内存暴涨,所以需要使用输入输出流,建立起文件和内存中的管道,通过管道输入和输出数据
文件输入流NSInputStream
- 创建输入流
NSInputStream *inputStream = [NSInputStream inputStreamWithFileAtPath:filePath];
inputStream.delegate = self;
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[inputStream open];
- 文件数据读取过程回调
- (void)stream:(NSInputStream *)stream handleEvent:(NSStreamEvent)eventCode {
switch(eventCode) {
case NSStreamEventOpenCompleted: // 文件打开成功
NSLog(@"文件打开,准备读取数据");
break;
case NSStreamEventHasBytesAvailable: // 读取到数据
{
uint8_t buf[1024];
NSInteger readLength = [stream read:buf maxLength:1024];
if (readLength > 0) {
[self.data appendBytes:(const void *)buf length:readLength];
}else {
NSLog(@"未读取到数据");
}
break;
}
case NSStreamEventEndEncountered: // 文件读取结束
{
NSLog(@"数据读取结束");
[stream close];
[stream removeFromRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
stream = nil;
break;
}
default:
break;
}
}
文件输出流NSOutputStream
- 创建输出流
// 开启文件输出流
self.outputStream = [NSOutputStream outputStreamToFileAtPath:_tempPath append:YES];
[self.outputStream open];
- 数据流输出
// 输出数据
[self.outputStream write:data.bytes maxLength:data.length];
- 关闭数据流
[self.outputStream close];
self.outputStream = nil;