我为NSFileHandleReadCompletionNotification
设置了NSNotification。
我使用两个独立的管道设置标准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
,而{{1}}只打印出输出新行的指示。
答案 0 :(得分: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的帮助。