首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使NSOutputStream重定向到标准输出?

如何使NSOutputStream重定向到标准输出?
EN

Stack Overflow用户
提问于 2011-08-15 05:50:29
回答 3查看 4.5K关注 0票数 9

我想知道使NSOutputStream重定向到标准输出的最佳方法是什么。我现在使用的技术是使用写入内存的输出流,获取其数据,并将其打印到stdout:

代码语言:javascript
复制
  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];

是否有更好的方法来实现这一点?具体来说,我对以下两件事不满意:

  1. 对于写入流
  2. 的数据需要额外的内存--这个流是不可重用的--在我通过[stream propertyForKey:NSStreamDataWrittenToMemoryStreamKey]从该流中检索数据之后,流不会“重置”,也就是说,我希望后续对该方法的调用只为我提供新的数据,但事实并非如此。这意味着我必须在每次向stdout写完NSOutputStream之后创建一个新的

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-21 06:04:24

似乎没有一个内置的方式来做这件事。如果可以使用NSFileHandle而不是NSOutputStream,则可以使用[NSFileHandle fileHandleWithStandardOutput]。如果您必须使用NSOutputStream,请尝试如下所示:

代码语言:javascript
复制
// 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;
}

现在用

代码语言:javascript
复制
FileHandleOutputStream *myStrem = [FileHandleOutputStream outputStreamWithFileHandle:
                                   [NSFileHandle fileHandleWithStandardOutput]];
票数 11
EN

Stack Overflow用户

发布于 2020-05-07 19:53:09

这里不需要Cocoa提供自己的构造函数,因为stdout可以作为“文件”使用。不幸的是,这似乎没有被记录在案,但效果很好:

代码语言:javascript
复制
NSOutputStream *outputStream =
    [NSOutputStream outputStreamToFileAtPath:@"/dev/stdout"
                                      append:NO];

您也可以对stderr做同样的事情(或者使用NSInputStream作为stdin)。

票数 0
EN

Stack Overflow用户

发布于 2011-09-08 16:43:24

您还可以使用"/dev/tty“作为文件打开一个NSOutputStream到stdout。("/dev/tty“是标准输入和输出的Unix名称。)

因此,您可以创建一个NSOutputStream,以便使用以下方法进行标准输出:

代码语言:javascript
复制
NSOutputStream *stream = [NSOutputStream outputStreamToFileAtPath: @"/dev/tty"
                                                           append: NO];

一个缺点是,如果您在Xcode中运行您的程序,它将无法工作;您将不得不在终端窗口中运行它。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7062042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档