我想知道使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/

    10-11 08:54