Вы должны реализовать NSStreamDelegate
методы для чтения файла с NSInputStream
. Вот как вы должны инициализировать ваш NSInputStream
экземпляр в таком случае:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Example" ofType:@"txt"];
NSInputStream *stream = [NSInputStream inputStreamWithFileAtPath:filePath];
[stream setDelegate:self]; // or any other object conforming to NSStreamDelegate
[stream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[stream open];
Объявите следующие свойства в классе, который вы используете для чтения файла:
@interface MyClassToReadFile: NSObject<NSStreamDelegate>
@property (strong, nonatomic) NSMutableData* data;
@property (nonatomic) NSInteger bytesRead;
@end
Вот какВы можете реализовать stream:handleEvent:
:
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
switch (eventCode) {
case NSStreamEventHasBytesAvailable: {
if(!_data) {
_data = [NSMutableData data];
}
uint8_t buf[1024]; // or any other size
NSInteger len = [(NSInputStream *)stream read:buf maxLength:sizeof(buf)/sizeof(buf[0])];
if(len) {
[_data appendBytes:(const void *)buf length:len];
_bytesRead += len;
}
break;
}
case NSStreamEventEndEncountered: {
[stream close];
[stream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
NSString* fileData = [[NSString alloc] initWithData:_data encoding:NSASCIIStringEncoding];
NSArray<NSString*>* numbersAsStrings = [fileData componentsSeparatedByCharactersInSet:NSCharacterSet.whitespaceCharacterSet];
NSMutableArray<NSNumber*>* numbers = [NSMutableArray array];
for (NSString* numberAsString in numbersAsStrings) {
[numbers addObject:[NSNumber numberWithLongLong:numberAsString.longLongValue]];
}
for (NSString* numberAsString in numbersAsStrings) {
NSLog(@"%lld", numberAsString.longLongValue);
}
break;
}
default:
break;
}
}