1

のNSNotificationを設定しましたNSFileHandleReadCompletionNotification

2本の別々のパイプで標準I/Oをセットアップしました。

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

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

Java jarを実行するNSTaskを起動し、データの読み取りを開始します。

[[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

ここに画像の説明を入力してください

これらの「>」文字は実際の出力の行である必要がありますが、代わりに出力はXcodeのコンソールに表示されます。

言い換えると、コンソールは、出力NSPipeの新しい行の表示のみを出力するmyではなく、出力を出力します。

4

1 に答える 1

4

上でコメントしたように、それは標準エラー出力をキャッチすることを追加する場合です。最近、同様の問題が発生しました。私は次のようにしてそれを解決しました:

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。

于 2012-02-23T12:16:47.233 に答える