我想知道使NSOutputStream重定向到标准输出的最佳方法是什么。我现在使用的技术是使用写入内存的输出流,获取其数据,并将其打印到stdout:
NSOutputStream *stream = [[NSOutputStream alloc] initToMemory];
[stream open];
// calls to stream's -write:maxLengh:
NSData *data = [stream propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
printf("%s", [string UTF8String]);
[stream close];是否有更好的方法来实现这一点?具体来说,我对以下两件事不满意:
[stream propertyForKey:NSStreamDataWrittenToMemoryStreamKey]从该流中检索数据之后,流不会“重置”,也就是说,我希望后续对该方法的调用只为我提供新的数据,但事实并非如此。这意味着我必须在每次向stdout写完NSOutputStream之后创建一个新的。
发布于 2011-08-21 06:04:24
似乎没有一个内置的方式来做这件事。如果可以使用NSFileHandle而不是NSOutputStream,则可以使用[NSFileHandle fileHandleWithStandardOutput]。如果您必须使用NSOutputStream,请尝试如下所示:
// untested!
@interface FileHandleOutputStream : NSOutputStream
+ (FileHandleOutputStream *)outputStreamWithFileHandle:(NSFileHandle *)fileHandle;
- (id)initWithFileHandle:(NSFileHandle *)fileHandle;
@end
@implementation FileHandleOutputStream {
NSFileHandle *_fileHandle;
}
+ (FileHandleOutputStream *)outputStreamWithFileHandle:(NSFileHandle *)fileHandle {
return [[[self alloc] initWithFileHandle:fileHandle] autorelease];
}
- (id)initWithFileHandle:(NSFileHandle *)fileHandle {
if (self = [super init]) {
_fileHandle = [fileHandle retain];
}
return self;
}
- (void)dealloc {
[_fileHandle release];
[super dealloc];
}
- (BOOL)hasSpaceAvailable {
return YES;
}
- (NSInteger)write:(const uint8_t *)buffer maxLength:(NSUInteger)length {
[_fileHandle writeData:[NSData dataWithBytesNoCopy:buffer
length:length
freeWhenDone:NO]];
return length;
}现在用
FileHandleOutputStream *myStrem = [FileHandleOutputStream outputStreamWithFileHandle:
[NSFileHandle fileHandleWithStandardOutput]];发布于 2020-05-07 19:53:09
这里不需要Cocoa提供自己的构造函数,因为stdout可以作为“文件”使用。不幸的是,这似乎没有被记录在案,但效果很好:
NSOutputStream *outputStream =
[NSOutputStream outputStreamToFileAtPath:@"/dev/stdout"
append:NO];您也可以对stderr做同样的事情(或者使用NSInputStream作为stdin)。
发布于 2011-09-08 16:43:24
您还可以使用"/dev/tty“作为文件打开一个NSOutputStream到stdout。("/dev/tty“是标准输入和输出的Unix名称。)
因此,您可以创建一个NSOutputStream,以便使用以下方法进行标准输出:
NSOutputStream *stream = [NSOutputStream outputStreamToFileAtPath: @"/dev/tty"
append: NO];一个缺点是,如果您在Xcode中运行您的程序,它将无法工作;您将不得不在终端窗口中运行它。
https://stackoverflow.com/questions/7062042
复制相似问题