我想知道使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。 最佳答案
似乎没有内置的方法可以做到这一点。如果可以使用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]];
关于objective-c - 如何使NSOutputStream重定向到标准输出?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7062042/