2011-10-30 19 views
1

我有一个代码,填充一个流。在填充之后,流的长度为1000(例如),而从Stream.ReadString返回的字符串长度为997,StreamReader.ReadToEnd()的返回值为空流。Stream.ReadString返回一个结果,而使用StreamReader.ReadToEnd返回string.Empty,都是错误的

这里有一个代码,显示我的意思(当然,这不正是我工作的代码,但问题是相同的):

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任何位置进行无变化

+2

Kent已经覆盖了大部分内容 - 但是在第一个块中调用了ReadToEnd之后,没有更多内容可以从流或阅读器中读取,因为它们都位于流尾。也许你应该发布一些* real *代码作为一个简短但完整的程序,它实际上编译和演示了这个问题... –

回答

2

字符串的长度(字符数)并不一定是相同的长度作为流(字节)。它完全取决于编码和与存储字符串相关的任何其他开销(如存储其长度)。

至于你的第二个测试,stream.ReadString()甚至不存在,如果有的话,将不得不假设一定的编码。

+1

ReadString是一个DevExpress扩展方法,没有注意到我用它的DLL,抱歉。 – Neowizard

+0

@Newizard:它使用什么编码?你首先得到了哪些数据?你的问题不清楚你为什么会期望*任何其他结果。 –

+0

我预计字符串长度与我从中提取的字符串大小相同,但@Kent解释了那里的错误。 – Neowizard