NSTask направляет вывод в консоль, а не в NSFileHandle - PullRequest
1 голос
/ 01 февраля 2012

Я настроил NSNotification для NSFileHandleReadCompletionNotification.

Я настроил стандартный ввод / вывод с двумя отдельными каналами.

NSPipe * input  = NSPipe.new;
NSPipe * output = NSPipe.new;

[serverTask setStandardInput:input];
[serverTask setStandardOutput:output];

Я запускаю NSTask, выполняющий Java jar,и начинаю читать данные.

[[serverTask.standardOutput fileHandleForReading] readInBackgroundAndNotify];

, и я постоянно читаю данные и добавляю данные в NSTextView, если это новые данные:

- (void)serverLogHasChanged:(NSNotification *)notification
{
    [[serverTask.standardOutput fileHandleForReading] readInBackgroundAndNotify];

    NSData * newData = [notification.userInfo objectForKey:NSFileHandleNotificationDataItem];

    if (newData != nil && availableData != newData)
    {
        NSMutableString * serverLogString = [NSMutableString stringWithString:serverLog.string];

        [serverLogString appendString:[NSString.alloc initWithData:newData encoding:NSUTF8StringEncoding]];
        [serverLog setString:serverLogString];
        [serverLog.enclosingScrollView.contentView scrollPoint:NSMakePoint(0, NSMaxY(serverLog.enclosingScrollView.contentView.bounds))];
    }

    newData = availableData;
}

Однако я получаю странный вывод в NSTextView

enter image description here

Эти символы ">" должны быть строками реального вывода, но вместо этого вывод заканчивается в консоли Xcode.

Другими словами, консоль печатает вывод вместо моего NSPipe, который печатает только индикацию новых строк вывода.

1 Ответ

4 голосов
/ 23 февраля 2012

Как уже было сказано выше, это случай добавления перехвата стандартного вывода ошибок. У меня недавно была похожая проблема. Я решил это, выполнив следующее:

NSPipe *pipe = [NSPipe pipe];
[javaTask setStandardOutput:pipe];
[javaTask setStandardError:pipe];
NSFileHandle *fileHandleForReading = [pipe fileHandleForReading];

[javaTask launch];

NSData *result = [fileHandleForReading readDataToEndOfFile];

NSString *output = [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];

Спасибо, CRD за вашу помощь.

...