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;
上一篇 下一篇

猜你喜欢

热点阅读