【问题标题】:Stream.ReadString returns one result while using StreamReader.ReadToEnd returns string.Empty and both are wrongStream.ReadString 返回一个结果,而使用 StreamReader.ReadToEnd 返回 string.Empty 并且两者都是错误的
【发布时间】:2011-10-30 09:40:26
【问题描述】:

我有一个填充流的代码。填充后,流的长度为1000(例如),而Stream.ReadString返回的字符串长度为997,StreamReader.ReadToEnd()返回的值为空流。

这是一个显示我的意思的代码(显然,这不完全是我的工作代码,但问题是一样的):

MemoryStream stream = MethodCreatingPopulatedStream(stream);
StreamReader reader = new StreamReader(stream);

if (stream.Length != reader.ReadToEnd().Length)
{
    PostQuestionInStackOverFlow();
}
else if (!string.Equals(reader.ReadToEnd(), stream.ReadString()))
{
    PostQuestionInStackOverFlow();
    GetAnnoyedAtDotNet();
}
else
{
    Smile();
}

我在这里错过了什么?

P.S,在任何地方添加 Stream.Flush 都没有改变

【问题讨论】:

  • Kent 已经涵盖了大部分内容 - 但是在您在第一个块中调用 ReadToEnd 之后,无论从流还是从读取器中都没有什么可以读取的了,因为两者都位于末尾的流。也许您应该发布一些真实代码作为一个简短但完整的程序,它实际上可以编译和演示问题......

标签: c# stream streamreader


【解决方案1】:

字符串(字符)的长度不一定与流(字节)的长度相同。它完全取决于编码以及与存储字符串相关的任何其他开销(例如存储其长度)。

至于您的第二个测试,stream.ReadString() 甚至不存在,如果存在则必须假设某种编码。

【讨论】:

  • ReadString 是一个 DevExpress 扩展方法,没有注意到我取它的 dll,抱歉。
  • @Neowizard:它使用什么编码?您实际上首先获得了哪些数据?您的问题不清楚您为什么期望任何其他结果。
  • 我希望字符串长度与我从中提取的字符串大小相同,但@Kent 在那里解释了错误。
  • 更正,我在之前的评论中指的是“流长度”。另外,需要注意的是,流包含我放置在应用程序的另一个流中的文本数据(使用 StreamWritere.Write(string))
猜你喜欢
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 2011-09-30
  • 2018-03-09
  • 1970-01-01
  • 2018-11-28
  • 2011-02-04
  • 1970-01-01
相关资源
最近更新 更多