gpt4 book ai didi

java - NSTask 将输出通过管道传输到控制台而不是 NSFileHandle

转载 作者:行者123 更新时间:2023-11-29 03:50:18 26 4
gpt4 key购买 nike

我为 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 中得到了奇怪的输出

enter image description here

那些“>”字符应该是实际输出的行,但输出最终出现在 Xcode 的控制台中。

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

最佳答案

正如上面所评论的,这是一个添加捕获标准错误输出的案例。我最近遇到了类似的问题。我通过执行以下操作解决了它:

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 的帮助。

关于java - NSTask 将输出通过管道传输到控制台而不是 NSFileHandle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9098611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com