我有一个不可查找的只读System.IO.Stream
实现(它的Position
总是返回0)。我需要将它发送给在流上执行一些Seek
操作(也就是设置位置)的消费者。这并不是一个巨大的追求--比如说从目前的位置+/- 100。是否有一个现有的Stream
包装器,可以为简单的Seek操作向流添加缓冲功能?
更新:我应该补充说,我的客户是NAudio Mp3FileReader。我真的只需要一种方法来播放(缓慢和无限)流MP3。我认为这是一个错误,NAudio期望能够随意地寻找他们的数据源。
发布于 2012-10-24 01:27:18
向前查找很简单(只需阅读),但如果没有缓冲,则无法向后查找。也许只是:
using(var ms = new MemoryStream()) {
otherStream.CopyTo(ms);
ms.Position = 0;
// now work with ms
}
然而,这只适用于小到中等的流(不是GB),已知结束(流不需要结束)。如果您需要更大的流,则可以对临时文件执行FileStream
,但它的IO密集度要高得多。
发布于 2012-10-24 03:23:04
另一种解决方案可能是创建自己的流类,它包装另一个流。将Seek实现为NOP。
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; }
}
如果玩家没有很好的理由去寻找,这可能就行得通。
发布于 2019-01-08 07:57:26
如果使用System.Net.WebClient
,而不是使用返回Stream
的OpenRead()
,而是使用webClient.DownloadData("https://your.url")
来获取字节数组,然后可以将其转换为MemoryStream
。下面是一个示例:
byte[] buffer = client.DownloadData(testBlobFile);
using (var stream = new MemoryStream(buffer))
{
... your code using the stream ...
}
显然,这会在创建Stream
之前下载所有内容,因此可能与使用Stream
的目的背道而驰。
https://stackoverflow.com/questions/13035925
复制相似问题