首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >流包装器使流可查找?

流包装器使流可查找?
EN

Stack Overflow用户
提问于 2012-10-24 01:22:45
回答 4查看 20.9K关注 0票数 24

我有一个不可查找的只读System.IO.Stream实现(它的Position总是返回0)。我需要将它发送给在流上执行一些Seek操作(也就是设置位置)的消费者。这并不是一个巨大的追求--比如说从目前的位置+/- 100。是否有一个现有的Stream包装器,可以为简单的Seek操作向流添加缓冲功能?

更新:我应该补充说,我的客户是NAudio Mp3FileReader。我真的只需要一种方法来播放(缓慢和无限)流MP3。我认为这是一个错误,NAudio期望能够随意地寻找他们的数据源。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-24 01:27:18

向前查找很简单(只需阅读),但如果没有缓冲,则无法向后查找。也许只是:

代码语言:javascript
复制
using(var ms = new MemoryStream()) {
    otherStream.CopyTo(ms);
    ms.Position = 0;
    // now work with ms
}

然而,这只适用于小到中等的流(不是GB),已知结束(流不需要结束)。如果您需要更大的流,则可以对临时文件执行FileStream,但它的IO密集度要高得多。

票数 21
EN

Stack Overflow用户

发布于 2012-10-24 03:23:04

另一种解决方案可能是创建自己的流类,它包装另一个流。将Seek实现为NOP。

代码语言:javascript
复制
class MyStream : Stream
{
    public MyStream(Stream baseStream) { this.baseStream = baseStream; }
    private Stream baseStream;

    // Delegate all operations except Seek/CanSeek to baseStream

    public override bool CanSeek { get { return true; } }
    public override long Seek(long offset, SeekOrigin origin) { return baseStream.Position; }
}

如果玩家没有很好的理由去寻找,这可能就行得通。

票数 0
EN

Stack Overflow用户

发布于 2019-01-08 07:57:26

如果使用System.Net.WebClient,而不是使用返回StreamOpenRead(),而是使用webClient.DownloadData("https://your.url")来获取字节数组,然后可以将其转换为MemoryStream。下面是一个示例:

代码语言:javascript
复制
byte[] buffer = client.DownloadData(testBlobFile);
using (var stream = new MemoryStream(buffer))
{
    ... your code using the stream ...
}

显然,这会在创建Stream之前下载所有内容,因此可能与使用Stream的目的背道而驰。

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

https://stackoverflow.com/questions/13035925

复制
相关文章

相似问题

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