2012-02-01 78 views
1

我为NSFileHandleReadCompletionNotification设置了NSNotification。NSTask管道输出到控制台而不是NSFileHandle

我用两个独立的管道设置了标准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

enter image description here

那些“>”字符应该是实际输出的行,而是输出结束于Xcode的控制台。

换句话说,控制台正在打印输出,而不是打印出输出新行的指示的输出NSPipe

+0

嗯,我的工艺包装?你有没有尝试将任务的输出设置为'[NSFileHandle fileHandleWithStandardOutput]'? – 2012-02-01 15:41:03

+0

是的。如果我这样做,我在NSTextView和现在在控制台中没有任何东西:'174食谱 27成就 > 10:46:49 [INFO]启动我的世界服务器版本1.1 > 10:46:49 [INFO ] Loading properties > 10:46:49 [INFO]在本地主机上启动Minecraft服务器:25565 > etc ... – evdude100 2012-02-01 15:48:05

+2

您尝试捕捉的输出有没有机会出现标准错误?如果是这样,你也需要捕获它。 – CRD 2012-02-01 16:37:43

回答

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为您提供帮助。