首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么BufferedStream.Write会抛出“这个流不支持seek操作”?

为什么BufferedStream.Write会抛出“这个流不支持seek操作”?
EN

Stack Overflow用户
提问于 2010-06-23 01:41:20
回答 2查看 6.7K关注 0票数 9

这一点让我很困惑。当我甚至没有调用它的时候,我得到了一个关于搜索的错误?

我的代码看起来像这样:

代码语言:javascript
复制
// send 42
uint value = 42;
byte[] msg = BitConverter.GetBytes(value);
stream.Write(msg, 0, sizeof(uint));

我得到了这个例外:

代码语言:javascript
复制
System.NotSupportedException was unhandled
Message="This stream does not support seek operations."
Source="System"
StackTrace:
   at System.Net.Sockets.NetworkStream.Seek(Int64 offset, SeekOrigin origin)
   at System.IO.BufferedStream.FlushRead()
   at System.IO.BufferedStream.Write(Byte[] array, Int32 offset, Int32 count)
...

流的类型为System.IO.BufferedStream。到底是怎么回事?

使用更多信息进行编辑:

在本例中为sizeof(uint)==msg.length

该流被声明为stream = new BufferedStream(new NetworkStream(socket), 1024)

编辑:

就是这样!虽然人们可以在单个NetworkStream上进行读写,但当切换到BufferedStream时,有必要使用单独的一个来进行读写。显然,只需在同一套接字上调用NetworkStream构造函数两次即可实现。

如果可以的话,我会接受贾斯汀和汉斯的答案,因为其中一个让我准确地理解了哪里出了问题,而另一个则引导我找到了解决方案。谢谢大家!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-23 02:06:47

问题出在BufferedStream的内部工作方式(以及您可能在尝试写入之前使用BufferedStream进行读取的事实)。

当您尝试写入BufferedStream时,在验证参数后,将按此顺序进行检查(通过反射器从框架中提取所有代码):

我们是在请求写缓冲区吗?

代码语言:javascript
复制
if(this._writePos == 0)

我们被允许写入底层流吗?

代码语言:javascript
复制
if(!this._s.CanWrite) // throw error

读缓冲区是空的吗?

代码语言:javascript
复制
if(this._readPos < this._readLen)
{
    // FlushRead() will attempt to call Seek()
    this.FlushRead();
}

如果读缓冲区中有未读数据,则在写入之前尝试刷新。FlushRead()调用Seek(),就是导致错误的原因。

票数 9
EN

Stack Overflow用户

发布于 2010-06-23 01:57:28

您之前一定从该BufferedStream中阅读过。它是从NetworkStream获取字节的。这些都是单向的,您可以只读或只写,这取决于它们是如何创建的。如果需要更多帮助,请发布创建NetworkStream的代码。

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

https://stackoverflow.com/questions/3095640

复制
相关文章

相似问题

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