使用 NSOutputstream 有啥好处?

Posted

技术标签:

【中文标题】使用 NSOutputstream 有啥好处?【英文标题】:What's the advantages of using NSOutputstream?使用 NSOutputstream 有什么好处? 【发布时间】:2014-11-24 13:09:55 【问题描述】:

我需要从网上下载大文件,并保存到本地磁盘。

一开始我是这样保存数据的:

- (void)saveToLocalFile:(NSData *)data withOffset:(unsigned long long)offset

    NSString* localFile = [self tempLocalFile];
    dispatch_async(mFileOperationQueue_, ^

        NSFileHandle* fileHandle = [NSFileHandle fileHandleForWritingAtPath:localFile];
        if (fileHandle == nil) 
            [data writeToFile:localFile atomically:YES];
            return;
        
        else 
            [fileHandle seekToFileOffset:offset];
            [fileHandle writeData:data];
            [fileHandle closeFile];
        
    );

作为AFNetworking 使用NSOutputstream 将数据保存到本地,如下所示:

NSUInteger length = [data length];
    while (YES) 
        NSInteger totalNumberOfBytesWritten = 0;
        if ([self.outputStream hasSpaceAvailable]) 
            const uint8_t *dataBuffer = (uint8_t *)[data bytes];

            NSInteger numberOfBytesWritten = 0;
            while (totalNumberOfBytesWritten < (NSInteger)length) 
                numberOfBytesWritten = [self.outputStream write:&dataBuffer[(NSUInteger)totalNumberOfBytesWritten] maxLength:(length - (NSUInteger)totalNumberOfBytesWritten)];
                if (numberOfBytesWritten == -1) 
                    break;
                

                totalNumberOfBytesWritten += numberOfBytesWritten;
            

            break;
        

        if (self.outputStream.streamError) 
            [self.connection cancel];
            [self performSelector:@selector(connection:didFailWithError:) withObject:self.connection withObject:self.outputStream.streamError];
            return;
        
    

写文件时使用NSOutputstreamNSFileHandle有什么优势?

在性能方面有什么优势?

【问题讨论】:

你使用 NSFileHandle 增量保存数据吗? Ifso .. 这就是这种情况下输出流的要点 其实我很想知道在性能方面有什么优势? 我尝试了你的两种方法,它们都有效并且我的单元测试通过了,但是当我在 Finder 中打开实际文件时,它总是为空。你有什么想法吗? 【参考方案1】:

有几种不同的技术用于读取和写入文件的内容,几乎所有这些技术都受 ios 和 OS X 的支持。所有这些技术本质上都是相同的,但方式略有不同。有些技术要求您按顺序读取和写入文件数据,而其他技术可能允许您跳转并仅对文件的一部分进行操作。一些技术为异步读写提供自动支持,而另一些技术则同步执行,以便您可以更好地控制它们的执行。

从可用技术中进行选择是一个决定您希望对读写过程进行多大程度的控制以及您希望花费多少精力来编写文件管理代码的问题。像 Cocoa 流这样的高级技术限制了您的灵活性,但提供了易于使用的界面。 POSIX 和 Grand Central Dispatch (GCD) 等较低级别的技术可为您提供最大的灵活性和功能,但需要您编写更多代码。

异步读写文件

因为文件操作涉及访问磁盘(可能是网络服务器上的磁盘),所以几乎总是首选异步执行这些操作。 Cocoa 流和 Grand Central Dispatch (GCD) 等技术旨在始终异步执行,这使您可以专注于读取和写入文件数据,而不必担心代码在哪里执行。

使用流线性处理整个文件

如果您总是从头到尾读取或写入文件的内容,流提供了一个简单的接口来异步执行此操作。流通常用于管理套接字和其他类型的源,其中数据可能随着时间的推移变得可用。但是,您也可以使用流在一个或多个突发中读取或写入整个文件。有两种类型的流可用:

使用NSOutputStream 将数据顺序写入磁盘。 使用 NSInputStream 对象从磁盘顺序读取数据。

代码解释请通过Apple Documentaion。

【讨论】:

以上是关于使用 NSOutputstream 有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章

使用静态方法有啥好处?

使用 ExecutorService 有啥好处?

冗余限定符有啥缺点吗?有啥好处吗?

使用 INNER JOIN 有啥好处? [复制]

使用可达性有啥好处?

使用 boost::bind 有啥好处?