基于NSData重绕NSInputStream

时间:2010-02-09 16:05:18

标签: cocoa

我有一个NSData,我想读作NSInputStream。这样我就可以拥有一致的API来处理文件和内存中的数据。作为处理的一部分,我想确保流以一些字节集开头(如果没有,我需要以不同的方式处理它)。如果它的类型错误,我想避免将整个文件读入内存。

所以我正在寻找一种回放流的方法,或者在不移动读指针的情况下“偷看”即将到来的字节。如果这是一个用URL创建的NSInputStream,我可以在NSStreamFileCurrentOffsetKey上使用setProperty:forKey:但奇怪的是这对从NSData创建的NSInputStream不起作用(即使您认为这比文件版本更容易实现) )。我无法关闭并重新打开蒸汽来重置输入指针(NSStream显然不允许这样做。)

我可以使用NSData-only接口和-initWithContentsOfMappedFile重做这个问题,但如果可以的话,我宁愿继续使用NSStream方法。

2 个答案:

答案 0 :(得分:1)

我想我在这里听不懂。 NSInputStream可以从三个位置获取数据:套接字,NSData对象或文件。您没有说过要使用套接字,而另外两个套接字是您的数据源。此外,NSStream的文档说只有基于文件的流是可以搜索的。 (NSStream,概述,第3段)

鉴于此,我认为NSData对象将是更好的选择。 NSData对象将处理文件和字节(我认为你的意思是内存中的数据)。

但你考虑到并说你更喜欢坚持使用溪流。这里有其他考虑吗?

(编辑)抱歉,我应该这是一个真正的答案。我对你所描述的问题的回答是,使用NSData确实是正确的做法。

如果您更喜欢不同的答案,请提供更多详情。

答案 1 :(得分:1)

您确实可以在正在读取文件的NSInputStream中寻找:

BOOL samplePositionAccepted = [iStream setProperty:[NSNumber numberWithUnsignedLong:samplePosition] forKey:NSStreamFileCurrentOffsetKey];

我不确定这是否适用于NSData。 (对不起,我还没有足够的积分来发表评论......)

(哎呀抱歉,没看到你已经试过了......)